在尝试比较 C99 和 Rust 之间的一些差异时,我写了以下代码:
为了显示
为什么会将
typedef enum {
NICKLE, DIME, QUARTER, DOLLAR,
} Denom;
static const int cents[] = {
[NICKLE] = 5,
[DIME] = 10,
[QUARTER] = 25,
[DOLLAR] = 100,
};
int main () {
printf( "Result %d\n", cents[DIME] );
}
这个代码符合预期,现在我想展示一种越界访问,但是当我这样做时
typedef enum {
NICKLE, DIME, QUARTER, DOLLAR, ZOD = 20394
} Denom;
我原本期望
printf( "Result %d\n", cents[ZOD] );
为了显示
cents + ZOD
的访问权限,但是没有成功。 mov eax, 0
mov esi, eax
lea rdi, str.Result__d ; 0x5570bf1ed020 ; "Result %d\n"
mov eax, 0
call sym.imp.printf ; int printf(const char *format)
为什么会将
esi
设置为0
,并且这段代码会输出什么?Result 0
-Wall -Wextra -Wpedantic
也没有报错。GCC 是否提供控制此行为的标志?它是否知道这是越界的,如果是,它不会发出警告(或者可以发出警告)吗?
-fsanitize = undefined
的无条件调用。) - Ry-extern const int cents[4];
会产生警告,但是static
却不会。如果gcc也能对静态数组发出警告就好了。 - KamilCuk-Weverything -std=<c standard> -pedantic
编译您的项目并尝试运行即可。 - S.S. Anne