Skip to content

Commit 4a9b887

Browse files
akinomyogaRaclamusi
andcommitted
fix(cstdlib/mblen): バッファオーバーランの修正
残り MB_CUR_MAX バイトが読み取れることが保証されていないと未定義動作 Co-authored-by: Raclamusi <61970673+Raclamusi@users.noreply.github.com>
1 parent 0d0c489 commit 4a9b887

File tree

1 file changed

+10
-7
lines changed

1 file changed

+10
-7
lines changed

reference/cstdlib/mblen.md

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,15 @@ namespace std {
2626
## 例
2727
### 基本的な使い方
2828
```cpp example
29-
#include <iostream>
30-
#include <cstdlib>
3129
#include <clocale>
30+
#include <cstdlib>
31+
#include <cstring>
32+
#include <iostream>
3233
3334
int main() {
3435
std::setlocale(LC_ALL, "ja_JP.UTF-8");
3536
const char *str = "こんにちは";
36-
int result = std::mblen(str, MB_CUR_MAX);
37+
int result = std::mblen(str, std::strlen(str));
3738
std::cout << result << std::endl;
3839
return 0;
3940
}
@@ -46,18 +47,20 @@ int main() {
4647

4748
### 文字列の文字数を計算する
4849
```cpp example
49-
#include <iostream>
50-
#include <cstdlib>
5150
#include <clocale>
51+
#include <cstdlib>
52+
#include <cstring>
53+
#include <iostream>
5254

5355
int count_chars_mblen(const char* s) {
5456
// std::mblen 内部の std::mbstate_t を初期化する必要あり
5557
std::mblen(nullptr, 0);
5658

5759
int count = 0;
5860
std::size_t i = 0;
59-
while (s[i] != '\0') {
60-
int len = std::mblen(&s[i], MB_CUR_MAX);
61+
std::size_t bytes = std::strlen(s);
62+
while (i < bytes) {
63+
int len = std::mblen(&s[i], bytes - i);
6164
if (len < 0) {
6265
len = 1;
6366
}

0 commit comments

Comments
 (0)