Существует один ОЧЕНЬ рискованный / плохой способ => Обычно строковые литералы хранятся в разделе данных только для чтения. Таким образом, один из способов - попытаться записать в целевую строку - если segmentation fault
получено в signal callback
- тогда это означает, что ваша строка является литеральной, и вернуться к тестовой функции с longjmp
.
Что-то вроде:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <setjmp.h>
static jmp_buf jbuf;
static void catch_segv() {
longjmp(jbuf, 1);
}
int isLiteral(char * ptr) {
if (setjmp(jbuf) == 0)
return (*ptr = *ptr, 0);
else
return 1;
}
int main()
{
char writableString[] = "some writable string";
signal(SIGSEGV, catch_segv);
printf("is literal = %d\n", isLiteral(writableString));
printf("is literal = %d\n", isLiteral("read-only string"));
return 0;
}
Но, учитывая, что возобновление программы после SIGSEGV
очень рискованно, и учитывая, что строковые литералы не всегда хранятся в разделе данных только для чтения - это решение крайне не рекомендуется для производства.