arduino / arduino/ArduinoCore-API
Uninitalised memory when copying String with embedded NUL character
- 主要语言
- C++
- 星标
- 306
- 派生
- 150
- PR 合并指标
- 30 天内没有已合并 PR
描述
When you create a String object with an embedded NUL character, and you copy this String, the memory after the NUL byte is not copied, leading to uninitialised memory being used.
Here's sample code to show the error:
```
String sGlobal;
void dumpString(const String &s)
{
Serial.print("Got a string of length ");
Serial.println(s.length());
Serial.print(">");
for (size_t t = 0; t < s.length(); ++t) {
if (s.charAt(t) != '\0' && isascii(s.charAt(t))) {
Serial.print(s.charAt(t));
} else if (s.charAt(t) == '\0') {
Serial.print("\\0");
} else {
Serial.print("\\x");
Serial.print(s.charAt(t), HEX);
}
}
Serial.print("<");
Serial.println();
}
void encode(String &s)
{
while (s.length() < 12)
{
s += ' ';
}
Serial.println("s in encode is, after filling with spaces:");
dumpString(s);
s.setCharAt(11, '!');
s.setCharAt(10, 'd');
s.setCharAt(9, 'l');
s.setCharAt(8, 'r');
s.setCharAt(7, 'o');
s.setCharAt(6, 'w');
s.setCharAt(5, '\0');
s.setCharAt(4, 'o');
s.setCharAt(3, 'l');
s.setCharAt(2, 'l');
s.setCharAt(1, 'e');
s.setCharAt(0, 'H');
Serial.println("s in encode is, after setting its chars:");
dumpString(s);
}
void test() {
String sLocal;
Serial.println("sLocal in test is, after init:");
dumpString(sLocal);
Serial.println("sGlobal in test is, after init:");
dumpString(sGlobal);
encode(sLocal);
Serial.println("sLocal in test is, after encode:");
dumpString(sLocal);
Serial.println("sGlobal in test is, after encode:");
dumpString(sGlobal);
sGlobal = sLocal;
Serial.println("sGlobal in test is, after assignment:");
dumpString(sGlobal);
}
void setup()
{
Serial.begin(115200);
test();
}
void loop()
{
}
```
Output of the code:
```
Local in test is, after init:
Got a string of length 0
><
sGlobal in test is, after init:
Got a string of length 0
><
s in encode is, after filling with spaces:
Got a string of length 12
> <
s in encode is, after setting its chars:
Got a string of length 12
>Hello\0world!<
sLocal in test is, after encode:
Got a string of length 12
>Hello\0world!<
sGlobal in test is, after encode:
Got a string of length 0
><
sGlobal in test is, after assignment:
Got a string of length 12
>Hello\0n\xFFFFFFEF\xFFFFFFD6\xFFFFFFFF\<
```
Please merge #97 to fix this issue, or at least use ``memcpy()`` instead of ``strcpy()`` to initialise the data.
贡献指南
这个仓库没有索引到贡献指南
调研方向
首先复现所提供的 Arduino sketch,并检查 sGlobal = sLocal 涉及的 String 拷贝和赋值路径。将其行为与 issue #97 中提出的 fix 进行比较,重点关注嵌入 NUL 的情况。当拷贝能够保留完整的 12 字节值(包括 NUL 之后的字节),且不包含未初始化数据时,即表示完成。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- cpp
- 领域
- embedded-iot
- Issue 类型
- 缺陷
- 难度
- 2/5
- 预计耗时
- 1-3 小时
- 活跃度
- 停滞
- 描述清晰度
- 描述清楚
- 新手友好度
- 35/100