簡體   English   中英

GCC function 名稱沖突

[英]GCC function name conflict

我在測試示例代碼時遇到了一些問題,因為我的 abs function 沒有返回正確的結果。 abs(-2) 輸出 -2(順便說一句,如果不清楚的話,這應該是絕對值 function)

在有點絕望之后,我最終得到了以下代碼

#include <stdio.h>

unsigned int abs(int x) {
    return 1;
}

int main() {
    printf("%d\n", abs(-2));
    return 0;
}

這沒有任何用處,但可以說明我的問題。 這是輸出 -2,而預期為 output 1。

如果我將 function 名稱更改為其他名稱(例如 abs2),結果現在是正確的。 此外,如果我將其更改為接收兩個 arguments 而不是一個,它也可以解決問題。

我明顯的猜測:與標准 abs function 沖突。但這仍然不能解釋為什么 output 是 -2(如果使用標准 abs 函數,它應該是 2)。 我嘗試檢查兩個版本的程序集 output(function 名為 abs 和 abs2)

這是兩個程序集的差異 output:

23,25c23,25
< .globl abs
<   .type   abs, @function
< abs:
---
> .globl abs2
>   .type   abs2, @function
> abs2:
54c54
<   .size   abs, .-abs
---
>   .size   abs2, .-abs2
71c71,74
<   movl    -4(%rbp), %edx
---
>   movl    -4(%rbp), %eax
>   movl    %eax, %edi
>   call    abs2
>   movl    %eax, %edx

據我了解,第一個版本(其中 function 被命名為 abs)只是丟棄了 function 調用,因此使用參數 x 而不是 abs(x)

總結一下:為什么會發生這種情況,特別是因為我找不到一種方法來獲得有關此的任何警告或錯誤。

在 Debian Squeeze、ggc 4.4.5 和 gcc 4.1.2 上測試

由於以下因素的相互作用,GCC 正在捉弄你:

  • abs是內置的function;
  • 您聲明abs返回unsigned int而標准(和內置) abs返回signed int

嘗試使用gcc -fno-builtin進行編譯; 在我的盒子上,給出了1的預期結果。 不使用該選項但將abs聲明為返回signed int進行編譯會導致程序打印2

(此問題的真正解決方案是不要為您自己的函數使用庫標識符。另請注意,您不應該使用%d打印unsigned int 。)

gcc優化了對abs()的調用以使用其內置的abs() 因此,如果您使用-fno-builtin選項(或將abs()定義為返回int ),您會注意到您得到了正確的結果。 根據這個(引用):

GCC 包含標准 C 庫中許多函數的內置版本。 以 _ builtin為前綴的版本將始終被視為與 C 庫 function 具有相同的含義,即使您指定了 -fno-builtin 選項。 (參見 C 方言選項)其中許多功能僅在某些情況下進行了優化; 如果它們在特定情況下沒有優化,將發出對庫 function 的調用

如果你包含了stdlib.h ,它首先聲明了abs() ,你會在編譯時得到一個錯誤。

聽起來很像這個錯誤,它來自 2007 年並已修復。

您當然應該嘗試在沒有 GCC 內在函數的情況下進行編譯,即在編譯時傳遞-fno-builtin (或僅傳遞 -fno- -fno-builtin-abs以僅刪除abs() )。

暫無
暫無

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

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