Kil*_*All 2 c++ g++ compiler-optimization docker
The behavior of the executable is different if it is run inside the docker, or on the host. But this only happens when we change the optimization level of G++.
Compiler: g++ (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0
我正在尝试执行以下代码:
#include <cstdio>
#include <cstring>
int main()
{
int nOrd =3395;
char cOrd[] = "003395";
char cAux2[256];
strcpy(cAux2, cOrd);
int nRest = nOrd % 26;
printf("BEFORE SPRINTF %s\n\n\n", cAux2);
sprintf(cAux2, "%s%c", cAux2, (nRest+65));
printf("AFTER SPRINTF %s\n\n\n", cAux2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我编译:
g++ -o FastCompile FastCompile.c -DNDEBUG -Os
Run Code Online (Sandbox Code Playgroud)
我在主持人中跑。输出是预期的:
BEFORE SPRINTF 003395
AFTER SPRINTF 003395P
Run Code Online (Sandbox Code Playgroud)
如果我使用此可执行文件创建映像并在docker内部运行,我将:
Docker版本18.09.4,内部版本d14af54266
Dockerfile:
FROM debian
RUN apt-get update && apt-get install -y \
libssl-dev
COPY fast/ /usr/local/
ENTRYPOINT ["usr/local/FastCompile"]
Run Code Online (Sandbox Code Playgroud)
$ docker build -t快速编译
$ docker运行fastcompile
BEFORE SPRINTF 003395
AFTER SPRINTF P
Run Code Online (Sandbox Code Playgroud)
如果我删除-Os并重新编译为:
g++ -o FastCompile FastCompile.c -DNDEBUG
Run Code Online (Sandbox Code Playgroud)
该行为在Docker内部是正确的。
那么,这是Docker问题吗?还是预期的行为?
您的代码具有未定义的行为。
sprintf(cAux2, "%s%c", cAux2, (nRest+65));
Run Code Online (Sandbox Code Playgroud)
从同一对象读取和写入。要解决此问题,您可以cOrd在调用中使用它,这样就不会从缓冲区读取数据。看起来像
sprintf(cAux2, "%s%c", cOrd, (nRest+65));
Run Code Online (Sandbox Code Playgroud)
还要注意,(nRest+65)给您一个int,而不是char您在格式说明符中指定的状态。这也是未定义的行为。您需要将其转换为char进行修复,例如
sprintf(cAux2, "%s%c", cOrd, char(nRest+65));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
43 次 |
| 最近记录: |