I'm tweaking with basename
right now and I encounter a case really weird (at least for me). Here's the code:
char buffer[300];
char* p;
strcpy(buffer, "../src/test/resources/constraints_0020_000");
printf("%d\n", strcmp(basename("../src/test/resources/constraints_0020_000"), "constraints_0020_000")); //works as expected
printf("assert testBasename02");
printf("%d\n", strcmp(basename(buffer), "constraints_0020_000") == 0);
printf("done 1\n"); //goes in segmentation fault
printf("%d\n", strcmp(basename(&buffer), "constraints_0020_000") == 0);
printf("done 2\n"); //goes in segmentation fault
printf("%d\n", strcmp(basename(&buffer[0]), "constraints_0020_000") == 0);
printf("done 3\n"); //goes in segmentation fault
p = malloc(strlen("../src/test/resources/constraints_0020_000") +1);
strcpy(p, "../src/test/resources/constraints_0020_000");
printf("%d\n", strcmp(basename(p), "constraints_0020_000") == 0); //works as expected
free(p);
printf("all done\n");
The first strcmp
works totally as excepted; it is the second one that puzzles me: why a buffer would go in segmentation fault? I tried to code the buffer all in different ways but the result is the same.
I can of course live with this behaviour but... I don't really understand what is the difference for basename
if i feed him a const char*
or a buffer (that in the end is also a char*
).
Is there a document that explain this behaviour? Is it just me? I tried to look for explanations but I couldn't find any.
Here the specification of my computer (if you need them):
- OS system: Ubuntu 16.4 (64 bit virtualized on Windows 10 64-bit);
- CPU (not that I think is useful): Intel® Core™ i5-3230M CPU @ 2.60GHz × 2;
According to the man page,
Basically,
invokes invokes undefined behavior as this is an attempt to modify the string literal.
Note: As mentioned in the man page, there's a change of words needed. Read it like,
A segmentation fault is one of the side effects of UB, but not the only one.
FWIW, attempt to modify a string literal itself invokes the UB. Quoting
C11
, chapter §6.4.5, String literalsEDIT:
As discussed in follow up comments, an additional problem was missing header file. You need to have
added so as to get the forward declaration of the function
basename()
available.