2015-10-01 23 views
0

的如下是由glibc的實現的功能strtoulstdlib.h的描述:glibc中strtoul的實現是否與C11標準衝突?

功能:unsigned long int類型strtoul將(常量字符* retrict字符串,字符**限制tailptr,INT基) 初步:| MT-Safe locale | AS-Safe | AC-Safe |請參閱POSIX安全概念。

strtoul(「string-to-unsigned-long」)函數與strtol類似,只是它轉換爲無符號的long int值。語法與上面描述的strtol相同。溢出時返回的值爲ULONG_MAX(請參閱類型的範圍)。

如果字符串表示負數,strtoul與strtol的作用相同,但會將結果轉換爲無符號整數。這意味着例如「-1」上的strtoul返回ULONG_MAX並且輸入比LONG_MIN返回的負(ULONG_MAX + 1)/ 2更負。

如果base超出範圍,或者ERANGE溢出,strtoul會將errno設置爲EINVAL。

這意味着,例如,"-2"將被轉換爲ULONG_MAX - 1。但C11標準[7.22.1.4-8]表示:

的strtol將,與strtoll,strtoul將和strtoull將函數返回轉換 值,如果有的話。如果不能執行轉換,則返回零。 如果正確值超出可表示值的範圍,則返回LONG_MIN,LONG_MAX,LLONG_MIN,LLONG_MAX,ULONG_MAX或ULLONG_MAX(根據返回類型和值的符號,如果有的話),以及宏的值ERANGE存儲在errno中。

因此,按照標準,例如,"-2"應轉換爲ULONG_MAX。這是衝突嗎?

+0

請注意,glibc跟C標準更接近[posix](http://pubs.opengroup.org/onlinepubs/9699919799/)。然而,C11 7.22.1.4.5似乎也處理了 - 符號,雖然我不清楚這種否定是否應該在引用7.22.1.4-8之前發生。 – nos

+0

@nos,謝謝,但作爲我回復chux的時候,即使發生在溢出轉換之後,仍然存在衝突。 – xskxzr

回答

1

這可能是glibc在標準化發生之前實現功能的另一種情況。

是的它衝突。

但是,我認爲glibc的結果更有用。如果您需要完美的合規性,則可以封裝該功能以執行轉換。

+0

謝謝。我贊同你。你知道在哪裏報告這個錯誤? – xskxzr

+0

@Shenke:取決於。如果錯誤在標準中,那麼不清楚在哪裏報告。如果你認爲glibc有bug,那麼就需要有一些說服力,用新標準來替代他們的標準。改變可能會破壞許多現有的用途。 – wallyk

3

沒有衝突。

如果主題序列與一個減號開始,從 所得的轉化的值(在返回類型)時取消。 C11dr§7.22.1.45

unsigned否定是明確的。

涉及無符號的操作數的一種計算可以永遠不會溢出,因爲不能由所得到的無符號整數類型所表示的結果是減少了模比可以由所得到的類型表示的最大值大一個數量。 6.2節。5 9

按照標準,「-2」應轉換爲ULONG_MAX - 2

所以也許「功能:無符號長......溢出」的文字與以某種方式C時的參數(特別是「輸入比LONG_MIN回報(ULONG_MAX + 1)/2更負)」的衝突,但strtoul()功能是正確的。

+0

謝謝。正如@nos所說,我不知道在我引用的溢出轉換之前或之後否定是否發生。但是,即使它發生在溢出轉換之後,正如您所說的那樣,輸入上的衝突可能比LONG_MIN更負,例如 - ULONG_MAX(實現將返回(ULONG_MAX + 1)/ 2,而它應該是1由標準)。 – xskxzr

+0

@ Shenke我剛剛在32位和64位主機上測試過,它返回1. – nos

+0

@nos我很困惑。看起來glibc的真正實現與它所記錄的不完全相同。文件太舊了嗎?我在這個網站上找到它:https://www.gnu.org/software/libc/manual/html_mono/libc.html – xskxzr

相關問題