2013-11-22 7 views
5

次のコードでは、ユーザーモードで正常に動作します:私たちは、カーネルモードである場合これはntoskrnl.exeのtolowerの実装における大きなバグですか?

#include <stdio.h> 
#include <ctype.h> 

int main() 
{ 
    // 
    // 0x7f51 is the unicode code of Chinese character '网' 
    // 
    int n = tolower(0x7f51); // n will equal 0x7f51 
} 

しかし、n0x7f71に等しくなります!

最も簡単なサンプルコード:

#include <ntifs.h> 

ULONG NTAPI DriverEntry(PDRIVER_OBJECT, PUNICODE_STRING) 
{ 
    int n = tolower(0x7f51); // n will equal 0x7f71 !!! 

    return 0; 
} 

これはNTOSKRNL.EXEでtolowerの実装に大きなバグですか?

+3

私は、あなたがカーネルモードで異なるロケール設定を持っていることを意味すると思います。代わりに 'tolower_l()'を使ってみてください。 –

+0

0x51 - > 0x71のように、最低7ビットでASCIIの小文字を使用しているようです。 –

+1

'tolower()'はユニコードでは動作しません。現在のロケールを使用して対応する小文字を検索します。 C99には 'towlower()'があり、おそらく助けになるでしょう。 – JIghtuse

答えて

5

tolower(int c)は、EOFまたは符号なしcharとして表現可能な整数cに対してのみ定義されています。 0x7f51もどちらでもありません。したがって、tolower(0x7f51)の動作は未定義です。

+0

Hmm。もし 'char'が16ビット以上で、' tolower() 'を実装している実装があれば驚くでしょうか?確かに一般的ではありません。 – chux

1

tolower()は、UnicodeではなくANSI文字用に設計されています。 Cプログラムのロケール設定は動作に影響します。 NTカーネルでWindows固有の変換関数を使用する方が良いです。

関連する問題