Greetings everyone, I hope I find you well.
I was playing with C and discovered an interesting TCC bug by mistake! Here's the code I used: ``` cat demo.tinyc #if 0 set -e; exec tcc -Wall -std=c11 -x c -run "$0" #endif /* * Original example taken from * https://riptutorial.com/c/example/10946/copying-strings * but of course I have expanded it a bit further. */ #include <stdio.h> #include <string.h> #include <assert.h> #ifdef DEBUG #include <time.h> #endif int main(void) { #ifdef DEBUG clock_t begin = clock(); printf("DEBUG MODE ON (current clock time (begin) is %ld)\n", begin); #endif char dst[24]; printf("sizeof(dst): %3zu bytes\n", sizeof(dst)); memset(dst, '\0', sizeof(dst)); char src[] = "Marvin and Nemo"; size_t len = strlen(dst); printf("strlen(dst): %3zu characters\n", len); strcpy(dst, "Clownfish: "); assert(len < sizeof(dst) - 1); strncat(dst + len, src, sizeof(dst) - len - 1); putchar('\n'); printf("sizeof(dst): %3zu bytes\n", sizeof(dst)); printf("dst(\"%s\") [%zu characters]\n", dst, strlen(dst)); #ifdef DEBUG printf("Current time via clock(): %ld, initial time (begin): %ld\n", clock(), begin); double timespent = (double)((clock() - begin)) / CLOCKS_PER_SEC; printf("Total time: %f secs, %.3f ms, %.2f μs\n", timespent, timespent*1000.0, timespent*1000.0*1000.0); #endif return 0; } /* vim: set ft=c: */ ``` Here is the command and output of GCC: gcc -x c -Wall -Wextra -Wpedantic -std=c11 -DDEBUG demo.tinyc -o dt && ./dt && rm dt DEBUG MODE ON (current clock time (begin) is 514) sizeof(dst): 24 bytes strlen(dst): 0 characters sizeof(dst): 24 bytes dst("Clownfish: Marvin and Nemo") [26 characters] Current time via clock(): 549, initial time (begin): 514 Total time: 0.000037 secs, 0.037 ms, 37.00 μs Here's also clang's: clang -x c -Wall -Wextra -Wpedantic -std=c11 -DDEBUG demo.tinyc -o dt && ./dt && rm dt DEBUG MODE ON (current clock time (begin) is 615) sizeof(dst): 24 bytes strlen(dst): 0 characters sizeof(dst): 24 bytes dst("Clownfish: Marvin and Nemo") [26 characters] Current time via clock(): 659, initial time (begin): 615 Total time: 0.000046 secs, 0.046 ms, 46.00 μs Now here's TCC's output: tcc -x c -Wall -std=c11 -DDEBUG demo.tinyc -o dt && ./dt && rm dt DEBUG MODE ON (current clock time (begin) is 521) sizeof(dst): 24 bytes strlen(dst): 0 characters sizeof(dst): 24 bytes dst("Clownfish: Marvin and Nemo") [26 characters] Current time via clock(): 557, initial time (begin): 28525 Total time: -0.027966 secs, -27.966 ms, -27966.00 μs No matter how many times I execute it, initial time (begin) remains 28525. I have no idea where to look for a possible fix. Please advice. Regards, Stefanos P.S.: the #if 0 trick is to create a portable way of scripting my code so I can test with all C compilers that exist out there; without it, it complains about the #! character on first line of code and does not let me compile it. As you can see, I have already demonstrated that way with 3 different compilers, whereas in reality I use it as `./demo.tinyc`. _______________________________________________ Tinycc-devel mailing list Tinycc-devel@nongnu.org https://lists.nongnu.org/mailman/listinfo/tinycc-devel