有一些簡單的代碼,其中clang和gcc的行爲有所不同。如何在clang中關閉本地數組合並?
int t;
extern void abort (void);
int f(int t, const int *a)
{
const int b[] = { 1, 2, 3};
if (!t)
return f(1, b);
return b == a;
}
int main(void)
{
if (f(0, 0))
abort();
return 0;
}
鏘:
> clang -v
clang version 4.0.1 (tags/RELEASE_401/final)
Target: x86_64-unknown-linux-gnu
Thread model: posix
> clang test.c
> ./a.out
Aborted
GCC:
> gcc -v
Target: x86_64-suse-linux
Thread model: posix
gcc version 7.2.0 (GCC)
> gcc test.c
> ./a.out
> echo $?
0
原因是很明顯的:是實現定義的行爲和鏗鏘合併當地不變陣列全球性的。
但讓我說我想要一致的行爲。我可以在clang中打開或關閉某些開關,以禁用此優化,併爲不同的堆棧幀真誠地創建不同的本地數組(即使是常數)。
複合文字的變量應該是'const int * b',我想。 –
@JensGustedt是的,我知道,它不應該工作,但它在叮噹中。無論如何,我刪除了切向實驗,因爲考慮到這是來自叮噹的故意行爲,所以它是無關緊要的。 – Art
謝謝,選項正是我所尋找的。 –