VirtualBox

source: vbox/trunk/src/VBox/Runtime/testcase/tstNoCrt-1.cpp@ 8170

Last change on this file since 8170 was 8170, checked in by vboxsync, 16 years ago

Rebranding: replacing more innotek strings.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 16.2 KB
Line 
1/* $Id: tstNoCrt-1.cpp 8170 2008-04-18 17:52:25Z vboxsync $ */
2/** @file
3 * Incredibly Portable Runtime Testcase - Testcase for the No-CRT assembly bits.
4 */
5
6/*
7 * Copyright (C) 2008 Sun Microsystems, Inc.
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * The contents of this file may alternatively be used under the terms
18 * of the Common Development and Distribution License Version 1.0
19 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20 * VirtualBox OSE distribution, in which case the provisions of the
21 * CDDL are applicable instead of those of the GPL.
22 *
23 * You may elect to license modified versions of this file under the
24 * terms and conditions of either the GPL or the CDDL or both.
25 *
26 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
27 * Clara, CA 95054 USA or visit http://www.sun.com if you need
28 * additional information or have any questions.
29 */
30
31/*******************************************************************************
32* Header Files *
33*******************************************************************************/
34#include <iprt/nocrt/string.h>
35#include <iprt/stream.h>
36#include <iprt/initterm.h>
37#include <iprt/string.h>
38#ifdef RT_WITHOUT_NOCRT_WRAPPERS
39# error "Build error."
40#endif
41
42
43/*******************************************************************************
44* Structures and Typedefs *
45*******************************************************************************/
46#define TSTBUF_SIZE 8192
47typedef struct TSTBUF
48{
49 uint8_t abHeadFence[2048];
50 uint8_t abBuf[TSTBUF_SIZE];
51 uint8_t abTailFence[2048];
52} TSTBUF, *PTSTBUF;
53
54
55/*******************************************************************************
56* Global Variables *
57*******************************************************************************/
58static unsigned g_cErrors = 0;
59
60
61static void my_memset(void *pv, int ch, size_t cb)
62{
63 uint8_t *pb = (uint8_t *)pv;
64 while (cb--)
65 *pb++ = ch;
66}
67
68static void my_memcheck(const void *pv, int ch, size_t cb, const char *pszDesc)
69{
70 uint8_t *pb = (uint8_t *)pv;
71 while (cb--)
72 {
73 if (*pb != (uint8_t)ch)
74 {
75 g_cErrors++;
76 size_t off;
77 for (off = 1; off < cb && pb[off] != (uint8_t)ch; off++)
78 /* nandemonai */;
79 off--;
80 pb += off;
81 cb -= off;
82 if (off)
83 RTPrintf("tstNoCrt-1: %s: %p:%p - %02x instead of %02x\n",
84 pszDesc, (uintptr_t)pb - (uintptr_t)pv,
85 (uint8_t *)pb - (uint8_t *)pv + off, *pb, (uint8_t)ch);
86 else
87 RTPrintf("tstNoCrt-1: %s: %p - %02x instead of %02x\n",
88 pszDesc, (uint8_t *)pb - (uint8_t *)pv, *pb, (uint8_t)ch);
89 }
90
91 /* next*/
92 pb++;
93 }
94}
95
96
97static void TstBufInit(PTSTBUF pBuf, int ch)
98{
99 my_memset(pBuf->abHeadFence, 0x55, sizeof(pBuf->abHeadFence));
100 my_memset(pBuf->abBuf, ch, sizeof(pBuf->abBuf));
101 my_memset(pBuf->abTailFence, 0x77, sizeof(pBuf->abHeadFence));
102}
103
104
105static void TstBufCheck(PTSTBUF pBuf, const char *pszDesc)
106{
107 my_memcheck(pBuf->abHeadFence, 0x55, sizeof(pBuf->abHeadFence), pszDesc);
108 my_memcheck(pBuf->abTailFence, 0x77, sizeof(pBuf->abTailFence), pszDesc);
109}
110
111
112#if 0 /* enable this to test the testcase. */
113# undef RT_NOCRT
114# define RT_NOCRT(a) a
115# ifdef _MSC_VER
116# define mempcpy nocrt_mempcpy
117# endif
118#endif
119
120int main()
121{
122 /*
123 * Prologue.
124 */
125 RTR3Init();
126 RTPrintf("tstNoCrt-1: TESTING...\n");
127
128 /*
129 * Sanity.
130 */
131 TSTBUF Buf1;
132 TstBufInit(&Buf1, 1);
133 my_memcheck(Buf1.abBuf, 1, TSTBUF_SIZE, "sanity buf1");
134 TstBufCheck(&Buf1, "sanity buf1");
135
136 TSTBUF Buf2;
137 TstBufInit(&Buf2, 2);
138 my_memcheck(Buf2.abBuf, 2, TSTBUF_SIZE, "sanity buf2");
139 TstBufCheck(&Buf2, "sanity buf2");
140 if (g_cErrors)
141 {
142 RTPrintf("tstNoCrt-1: FAILED - fatal sanity error\n");
143 return 1;
144 }
145
146#define CHECK_PV(expect) \
147 do \
148 { \
149 if (pv != (expect)) \
150 { \
151 RTPrintf("tstNoCrt-1(%d): pv=%p expected=%p\n", __LINE__, pv, (expect)); \
152 g_cErrors++; \
153 } \
154 } while (0)
155 void *pv;
156
157#define CHECK_DIFF(op) \
158 do \
159 { \
160 if (!(iDiff op 0)) \
161 { \
162 RTPrintf("tstNoCrt-1(%d): iDiff=%d expected: %s 0\n", __LINE__, iDiff, #op); \
163 g_cErrors++; \
164 } \
165 } while (0)
166 int iDiff;
167
168 static char s_szTest1[] = "0123456789abcdef";
169 static char s_szTest2[] = "0123456789abcdef";
170 static char s_szTest3[] = "fedcba9876543210";
171
172 /*
173 * memcpy.
174 */
175 RTPrintf("tstNoCrt-1: memcpy\n");
176 TstBufInit(&Buf1, 1);
177 TstBufInit(&Buf2, 2);
178 pv = RT_NOCRT(memcpy)(Buf1.abBuf, Buf2.abBuf, TSTBUF_SIZE); CHECK_PV(Buf1.abBuf);
179 my_memcheck(Buf1.abBuf, 2, TSTBUF_SIZE, "memcpy1-dst");
180 my_memcheck(Buf2.abBuf, 2, TSTBUF_SIZE, "memcpy1-src");
181 TstBufCheck(&Buf1, "memcpy1");
182 TstBufCheck(&Buf2, "memcpy1");
183
184 TstBufInit(&Buf1, 3);
185 TstBufInit(&Buf2, 4);
186 pv = RT_NOCRT(memcpy)(Buf2.abBuf, Buf1.abBuf, TSTBUF_SIZE); CHECK_PV(Buf2.abBuf);
187 my_memcheck(Buf1.abBuf, 3, TSTBUF_SIZE, "memcpy2-dst");
188 my_memcheck(Buf2.abBuf, 3, TSTBUF_SIZE, "memcpy2-src");
189 TstBufCheck(&Buf1, "memcpy2");
190 TstBufCheck(&Buf2, "memcpy2");
191
192 TstBufInit(&Buf1, 5);
193 TstBufInit(&Buf2, 6);
194 pv = RT_NOCRT(memcpy)(Buf2.abBuf, Buf1.abBuf, 0); CHECK_PV(Buf2.abBuf);
195 my_memcheck(Buf1.abBuf, 5, TSTBUF_SIZE, "memcpy3-dst");
196 my_memcheck(Buf2.abBuf, 6, TSTBUF_SIZE, "memcpy3-src");
197 TstBufCheck(&Buf1, "memcpy3-dst");
198 TstBufCheck(&Buf2, "memcpy3-src");
199
200 for (unsigned off1 = 0; off1 <= 128; off1++)
201 {
202 for (unsigned off2 = 0; off2 <= 256; off2++)
203 {
204 char sz[32];
205 RTStrPrintf(sz, sizeof(sz), "memcpy4-%d-%d", off1, off2);
206 TstBufInit(&Buf1, 1);
207 TstBufInit(&Buf2, 2);
208 size_t cb = off2;
209 pv = RT_NOCRT(memcpy)(&Buf2.abBuf[off2], &Buf1.abBuf[off1], cb); CHECK_PV(&Buf2.abBuf[off2]);
210 my_memcheck(Buf1.abBuf, 1, TSTBUF_SIZE, sz);
211 my_memcheck(Buf2.abBuf, 2, off2, sz);
212 my_memcheck(&Buf2.abBuf[off2], 1, cb, sz);
213 my_memcheck(&Buf2.abBuf[off2 + cb], 2, TSTBUF_SIZE - cb - off2, sz);
214 TstBufCheck(&Buf1, sz);
215 TstBufCheck(&Buf2, sz);
216 }
217 }
218
219 /*
220 * mempcpy.
221 */
222 RTPrintf("tstNoCrt-1: mempcpy\n");
223 TstBufInit(&Buf1, 1);
224 TstBufInit(&Buf2, 2);
225 pv = RT_NOCRT(mempcpy)(Buf1.abBuf, Buf2.abBuf, TSTBUF_SIZE); CHECK_PV(&Buf1.abBuf[TSTBUF_SIZE]);
226 my_memcheck(Buf1.abBuf, 2, TSTBUF_SIZE, "mempcpy1-dst");
227 my_memcheck(Buf2.abBuf, 2, TSTBUF_SIZE, "mempcpy1-src");
228 TstBufCheck(&Buf1, "mempcpy1");
229 TstBufCheck(&Buf2, "mempcpy1");
230
231 TstBufInit(&Buf1, 3);
232 TstBufInit(&Buf2, 4);
233 pv = RT_NOCRT(mempcpy)(Buf2.abBuf, Buf1.abBuf, TSTBUF_SIZE); CHECK_PV(&Buf2.abBuf[TSTBUF_SIZE]);
234 my_memcheck(Buf1.abBuf, 3, TSTBUF_SIZE, "mempcpy2-dst");
235 my_memcheck(Buf2.abBuf, 3, TSTBUF_SIZE, "mempcpy2-src");
236 TstBufCheck(&Buf1, "mempcpy2");
237 TstBufCheck(&Buf2, "mempcpy2");
238
239 TstBufInit(&Buf1, 5);
240 TstBufInit(&Buf2, 6);
241 pv = RT_NOCRT(mempcpy)(Buf2.abBuf, Buf1.abBuf, 0); CHECK_PV(Buf2.abBuf);
242 my_memcheck(Buf1.abBuf, 5, TSTBUF_SIZE, "mempcpy3-dst");
243 my_memcheck(Buf2.abBuf, 6, TSTBUF_SIZE, "mempcpy3-src");
244 TstBufCheck(&Buf1, "mempcpy3-dst");
245 TstBufCheck(&Buf2, "mempcpy3-src");
246
247 for (unsigned off1 = 0; off1 <= 128; off1++)
248 {
249 for (unsigned off2 = 0; off2 <= 256; off2++)
250 {
251 char sz[32];
252 RTStrPrintf(sz, sizeof(sz), "mempcpy4-%d-%d", off1, off2);
253 TstBufInit(&Buf1, 1);
254 TstBufInit(&Buf2, 2);
255 size_t cb = off2;
256 pv = RT_NOCRT(mempcpy)(&Buf2.abBuf[off2], &Buf1.abBuf[off1], cb); CHECK_PV(&Buf2.abBuf[off2 + cb]);
257 my_memcheck(Buf1.abBuf, 1, TSTBUF_SIZE, sz);
258 my_memcheck(Buf2.abBuf, 2, off2, sz);
259 my_memcheck(&Buf2.abBuf[off2], 1, cb, sz);
260 my_memcheck(&Buf2.abBuf[off2 + cb], 2, TSTBUF_SIZE - cb - off2, sz);
261 TstBufCheck(&Buf1, sz);
262 TstBufCheck(&Buf2, sz);
263 }
264 }
265
266 /*
267 * memmove.
268 */
269 RTPrintf("tstNoCrt-1: memmove\n");
270 TstBufInit(&Buf1, 1);
271 TstBufInit(&Buf2, 2);
272 pv = RT_NOCRT(memmove)(Buf1.abBuf, Buf2.abBuf, TSTBUF_SIZE); CHECK_PV(Buf1.abBuf);
273 my_memcheck(Buf1.abBuf, 2, TSTBUF_SIZE, "memmove1-dst");
274 my_memcheck(Buf2.abBuf, 2, TSTBUF_SIZE, "memmove1-src");
275 TstBufCheck(&Buf1, "memmove1");
276 TstBufCheck(&Buf2, "memmove1");
277
278 TstBufInit(&Buf1, 3);
279 TstBufInit(&Buf2, 4);
280 pv = RT_NOCRT(memmove)(Buf2.abBuf, Buf1.abBuf, TSTBUF_SIZE); CHECK_PV(Buf2.abBuf);
281 my_memcheck(Buf1.abBuf, 3, TSTBUF_SIZE, "memmove2-dst");
282 my_memcheck(Buf2.abBuf, 3, TSTBUF_SIZE, "memmove2-src");
283 TstBufCheck(&Buf1, "memmove2");
284 TstBufCheck(&Buf2, "memmove2");
285
286 TstBufInit(&Buf1, 5);
287 TstBufInit(&Buf2, 6);
288 pv = RT_NOCRT(memmove)(Buf2.abBuf, Buf1.abBuf, 0); CHECK_PV(Buf2.abBuf);
289 my_memcheck(Buf1.abBuf, 5, TSTBUF_SIZE, "memmove3-dst");
290 my_memcheck(Buf2.abBuf, 6, TSTBUF_SIZE, "memmove3-src");
291 TstBufCheck(&Buf1, "memmove3-dst");
292 TstBufCheck(&Buf2, "memmove3-src");
293
294 for (unsigned off1 = 1; off1 <= 128; off1++)
295 {
296 for (unsigned off2 = 0; off2 <= 256; off2++)
297 {
298 /* forward */
299 char sz[32];
300 RTStrPrintf(sz, sizeof(sz), "memmove4-%d-%d", off1, off2);
301 TstBufInit(&Buf1, off1 + 1);
302 my_memset(Buf1.abBuf, off1, off1);
303 pv = RT_NOCRT(memmove)(Buf1.abBuf, &Buf1.abBuf[off2], TSTBUF_SIZE - off2); CHECK_PV(Buf1.abBuf);
304 if (off2 < off1)
305 {
306 unsigned cbLead = off1 - off2;
307 my_memcheck(Buf1.abBuf, off1, cbLead, sz);
308 my_memcheck(&Buf1.abBuf[cbLead], off1 + 1, TSTBUF_SIZE - cbLead, sz);
309 }
310 else
311 my_memcheck(Buf1.abBuf, off1 + 1, TSTBUF_SIZE, sz);
312 TstBufCheck(&Buf1, sz);
313
314 /* backward */
315 RTStrPrintf(sz, sizeof(sz), "memmove5-%d-%d", off1, off2);
316 TstBufInit(&Buf1, off1 + 1);
317 my_memset(&Buf1.abBuf[TSTBUF_SIZE - off1], off1, off1);
318 pv = RT_NOCRT(memmove)(&Buf1.abBuf[off2], Buf1.abBuf, TSTBUF_SIZE - off2); CHECK_PV(&Buf1.abBuf[off2]);
319 if (off2 < off1)
320 {
321 unsigned cbLead = off1 - off2;
322 my_memcheck(&Buf1.abBuf[TSTBUF_SIZE - cbLead], off1, cbLead, sz);
323 my_memcheck(Buf1.abBuf, off1 + 1, TSTBUF_SIZE - cbLead, sz);
324 }
325 else
326 my_memcheck(Buf1.abBuf, off1 + 1, TSTBUF_SIZE, sz);
327 TstBufCheck(&Buf1, sz);
328 /* small unaligned */
329 RTStrPrintf(sz, sizeof(sz), "memmove6-%d-%d", off1, off2);
330 TstBufInit(&Buf1, 1);
331 TstBufInit(&Buf2, 2);
332 size_t cb = off2;
333 pv = RT_NOCRT(memmove)(&Buf2.abBuf[off2], &Buf1.abBuf[off1], cb); CHECK_PV(&Buf2.abBuf[off2]);
334 my_memcheck(Buf1.abBuf, 1, TSTBUF_SIZE, sz);
335 my_memcheck(Buf2.abBuf, 2, off2, sz);
336 my_memcheck(&Buf2.abBuf[off2], 1, cb, sz);
337 my_memcheck(&Buf2.abBuf[off2 + cb], 2, TSTBUF_SIZE - cb - off2, sz);
338 TstBufCheck(&Buf1, sz);
339 TstBufCheck(&Buf2, sz);
340 }
341 }
342
343 /*
344 * memset
345 */
346 RTPrintf("tstNoCrt-1: memset\n");
347 TstBufInit(&Buf1, 1);
348 pv = RT_NOCRT(memset)(Buf1.abBuf, 0, TSTBUF_SIZE); CHECK_PV(Buf1.abBuf);
349 my_memcheck(Buf1.abBuf, 0, TSTBUF_SIZE, "memset-1");
350 TstBufCheck(&Buf1, "memset-1");
351
352 TstBufInit(&Buf1, 1);
353 pv = RT_NOCRT(memset)(Buf1.abBuf, 0xff, TSTBUF_SIZE); CHECK_PV(Buf1.abBuf);
354 my_memcheck(Buf1.abBuf, 0xff, TSTBUF_SIZE, "memset-2");
355 TstBufCheck(&Buf1, "memset-2");
356
357 TstBufInit(&Buf1, 1);
358 pv = RT_NOCRT(memset)(Buf1.abBuf, 0xff, 0); CHECK_PV(Buf1.abBuf);
359 my_memcheck(Buf1.abBuf, 1, TSTBUF_SIZE, "memset-3");
360 TstBufCheck(&Buf1, "memset-3");
361
362 for (unsigned off = 0; off < 256; off++)
363 {
364 /* move start byte by byte. */
365 char sz[32];
366 RTStrPrintf(sz, sizeof(sz), "memset4-%d", off);
367 TstBufInit(&Buf1, 0);
368 pv = RT_NOCRT(memset)(&Buf1.abBuf[off], off, TSTBUF_SIZE - off); CHECK_PV(&Buf1.abBuf[off]);
369 my_memcheck(Buf1.abBuf, 0, off, sz);
370 my_memcheck(&Buf1.abBuf[off], off, TSTBUF_SIZE - off, sz);
371 TstBufCheck(&Buf1, sz);
372
373 /* move end byte by byte. */
374 RTStrPrintf(sz, sizeof(sz), "memset5-%d", off);
375 TstBufInit(&Buf1, 0);
376 pv = RT_NOCRT(memset)(Buf1.abBuf, off, TSTBUF_SIZE - off); CHECK_PV(Buf1.abBuf);
377 my_memcheck(Buf1.abBuf, off, TSTBUF_SIZE - off, sz);
378 my_memcheck(&Buf1.abBuf[TSTBUF_SIZE - off], 0, off, sz);
379 TstBufCheck(&Buf1, sz);
380
381 /* move both start and size byte by byte. */
382 RTStrPrintf(sz, sizeof(sz), "memset6-%d", off);
383 TstBufInit(&Buf1, 0);
384 pv = RT_NOCRT(memset)(&Buf1.abBuf[off], off, off); CHECK_PV(&Buf1.abBuf[off]);
385 my_memcheck(Buf1.abBuf, 0, off, sz);
386 my_memcheck(&Buf1.abBuf[off], off, off, sz);
387 my_memcheck(&Buf1.abBuf[off * 2], 0, TSTBUF_SIZE - off * 2, sz);
388 TstBufCheck(&Buf1, sz);
389 }
390
391 /*
392 * memchr & strchr.
393 */
394 RTPrintf("tstNoCrt-1: memchr\n");
395 pv = RT_NOCRT(memchr)(&s_szTest1[0x00], 'f', sizeof(s_szTest1)); CHECK_PV(&s_szTest1[0xf]);
396 pv = RT_NOCRT(memchr)(&s_szTest1[0x0f], 'f', sizeof(s_szTest1)); CHECK_PV(&s_szTest1[0xf]);
397 pv = RT_NOCRT(memchr)(&s_szTest1[0x03], 0, sizeof(s_szTest1)); CHECK_PV(&s_szTest1[0x10]);
398 pv = RT_NOCRT(memchr)(&s_szTest1[0x10], 0, sizeof(s_szTest1)); CHECK_PV(&s_szTest1[0x10]);
399 for (unsigned i = 0; i < sizeof(s_szTest1); i++)
400 for (unsigned j = 0; j <= i; j++)
401 {
402 pv = RT_NOCRT(memchr)(&s_szTest1[j], s_szTest1[i], sizeof(s_szTest1));
403 CHECK_PV(&s_szTest1[i]);
404 }
405
406 RTPrintf("tstNoCrt-1: strchr\n");
407 pv = RT_NOCRT(strchr)(&s_szTest1[0x00], 'f'); CHECK_PV(&s_szTest1[0xf]);
408 pv = RT_NOCRT(strchr)(&s_szTest1[0x0f], 'f'); CHECK_PV(&s_szTest1[0xf]);
409 pv = RT_NOCRT(strchr)(&s_szTest1[0x03], 0); CHECK_PV(&s_szTest1[0x10]);
410 pv = RT_NOCRT(strchr)(&s_szTest1[0x10], 0); CHECK_PV(&s_szTest1[0x10]);
411 for (unsigned i = 0; i < sizeof(s_szTest1); i++)
412 for (unsigned j = 0; j <= i; j++)
413 {
414 pv = RT_NOCRT(strchr)(&s_szTest1[j], s_szTest1[i]);
415 CHECK_PV(&s_szTest1[i]);
416 }
417
418 /*
419 * Some simple memcmp/strcmp checks.
420 */
421 RTPrintf("tstNoCrt-1: memcmp\n");
422 iDiff = RT_NOCRT(memcmp)(s_szTest1, s_szTest1, sizeof(s_szTest1)); CHECK_DIFF( == );
423 iDiff = RT_NOCRT(memcmp)(s_szTest1, s_szTest2, sizeof(s_szTest1)); CHECK_DIFF( == );
424 iDiff = RT_NOCRT(memcmp)(s_szTest2, s_szTest1, sizeof(s_szTest1)); CHECK_DIFF( == );
425 iDiff = RT_NOCRT(memcmp)(s_szTest3, s_szTest3, sizeof(s_szTest1)); CHECK_DIFF( == );
426 iDiff = RT_NOCRT(memcmp)(s_szTest1, s_szTest3, sizeof(s_szTest1)); CHECK_DIFF( < );
427 iDiff = RT_NOCRT(memcmp)(s_szTest3, s_szTest1, sizeof(s_szTest1)); CHECK_DIFF( > );
428
429 RTPrintf("tstNoCrt-1: strcmp\n");
430 iDiff = RT_NOCRT(strcmp)(s_szTest1, s_szTest1); CHECK_DIFF( == );
431 iDiff = RT_NOCRT(strcmp)(s_szTest1, s_szTest2); CHECK_DIFF( == );
432 iDiff = RT_NOCRT(strcmp)(s_szTest2, s_szTest1); CHECK_DIFF( == );
433 iDiff = RT_NOCRT(strcmp)(s_szTest3, s_szTest3); CHECK_DIFF( == );
434 iDiff = RT_NOCRT(strcmp)(s_szTest1, s_szTest3); CHECK_DIFF( < );
435 iDiff = RT_NOCRT(strcmp)(s_szTest3, s_szTest1); CHECK_DIFF( > );
436
437
438 /*
439 * Summary.
440 */
441 if (!g_cErrors)
442 RTPrintf("tstNoCrt-1: SUCCESS\n");
443 else
444 RTPrintf("tstNoCrt-1: FAILURE - %d errors\n", g_cErrors);
445 return !!g_cErrors;
446}
447
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette