簡體   English   中英

塊范圍緩沖區在c中的塊外部是否有效

[英]Is block-scope buffer valid outside of the block in c

我只是想知道以下情況是否可以視為安全做法:

void some_func(void) {
    const char * foo;

    if (SOME_MACRO()) {
       char * foo_buf[20];
       snprintf(foo_buf,sizeof(foo_buf),"blah_%d",some_global);
       foo = foo_buf;
    } else {
       foo = "some constant string";
    }
    // do a bunch of other stuff here...
    printf("%s\n", foo);
}

這假定foo_buf中的內存在塊作用域之外仍然有效( foo_buf更改)。 我擔心是否存在在塊退出時編譯器丟棄或覆蓋特定於塊的內存的情況。 我希望在塊中而不是在全局范圍中進行聲明的原因是,在某些平台上, SOME_MACRO()可以解析為常量,而在其他平台上則可以解析為表達式,因此可以優化if塊中的代碼。一些案例。

這使得foo_buf中的內存在塊作用域之外仍然有效(且未更改)

這是一個很大的假設。 嘗試將內存取消引用到不再在范圍內的變量會調用未定義的行為 無法保證內存將包含您認為的內容。

最好在更高范圍內定義該緩沖區,使其仍然有效,或者動態分配內存以使其保持有效。

另外,類型不正確:

char * foo_buf[20];

這定義了一個指針數組,而不是字符數組。 它應該是:

char foo_buf[20];

是UB。

解除char * foo_buf[20]; 不應給您更糟糕的代碼。 無論如何,所有函數的本地變量都可能分配在頂部,並且編譯器非常有能力消除從未使用過的本地變量。

嘗試編譯:

#define UP 0
#define CONST 1

#include <stdio.h>

#if CONST
   #define SOME_MACRO() 0
#else
   int SOME_MACRO(void);
#endif

int some_global;


void some_func(void) {
    const char * foo;

#if UP
    char foo_buf[20]; //fixed from char *foo_buf[20];
#endif


    if (SOME_MACRO()) {
#if !UP
       char foo_buf[20]; //fixed from char *foo_buf[20];
#endif
       snprintf(foo_buf,sizeof(foo_buf),"blah_%d",some_global);
       foo = foo_buf;
    } else {
       foo = "some constant string";
    }
    // do a bunch of other stuff here...
    printf("%s\n", foo);
}

將CONST設置為0或1,然后將UP更改為0到1。

使用gcc,clang或icc移動聲明(通過更改UP ),即使在-O0處也沒有區別: https : -O0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM