Я пытаюсь усложнить реверс-инжиниринг со строковыми литералами, как в первом блоке кода. Я инициализирую его как скаляр с летучими компонентами. Он является изменчивым, поэтому компилятор не будет его оптимизировать и превращать в простой строковый литерал при компиляции.
#include <stdio.h>
static const volatile char a = 'a', b = 'b', c = 'c', d = 'd', e = 'e', f = 'f';
inline const char *_GetString(void) {
return (const char[]){a, b, c, d, e, f, 0};
}
const char *GetString(void) {
const char *x = _GetString();
puts(x);
return x;
}
int main(int argc, char *argv[]) {
puts(GetString());
return 0;
}
Предыдущее не печатает abcdef
дважды. Однако это так:
#include <stdio.h>
const char *_GetString(void) {
return "abcdef";
}
const char *GetString(void) {
const char *x = _GetString();
puts(x);
return x;
}
int main(int argc, char *argv[]) {
puts(GetString());
return 0;
}
Почему это происходит? Как я могу вернуть строку из функции таким способом, который не действует странно, но при этом сохраняет функцию встроенной и трудной для обратного инжиниринга?