Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

修复 Pika 的 Ctest 报错 #1783

Closed
Mixficsol opened this issue Jul 21, 2023 · 3 comments · Fixed by #2033
Closed

修复 Pika 的 Ctest 报错 #1783

Mixficsol opened this issue Jul 21, 2023 · 3 comments · Fixed by #2033
Labels

Comments

@Mixficsol
Copy link
Collaborator

Mixficsol commented Jul 21, 2023

Describe the bug

Pika 目前在 Macos 环境的 CTest 有以下测试有报错

Screenshots

截屏2023-07-21 22 19 59

To Reproduce

如果你有 Macos 环境,以下是复现步骤:

# 编译
rm -rf build buildtrees output 
cmake -B build -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS_DEBUG=-fsanitize=address
cmake --build build --config Debug

# 执行
./build/src/storage/tests/hashes_test

如果你是其他环境,也可以执行上述语句查看一下其他环境的 Ctest 有没有问题,如果存在问题可以建 issue 留言

Additional context

可参考PR: #1721

报错日志:Log.md

相关问题可咨询: @Mixficsol @cheniujh @tedli

@tedli
Copy link
Contributor

tedli commented Jul 22, 2023

结论:误报

依据:参考文献
image

根因:
cmake 参数不透传,就是说 -fsanitize=address 在 pika 本身代码的编译过程生效了。但是在 pika 依赖的各个库,如 rocksdb 等,未透传 -fsanitize=address。结果就是 pika 依赖的各个库没有开 sanitize,pika 自己开了。就踩了参考文献提到的 false-positives

非 macos 复现步骤:

其中 CXXFLAGSLDFLAGS 如果把 -fsanitize=address 去掉,即可复现,即一部分开 sanitize 了(pika 本身),一部分没开(各种依赖库)。如果加上,就能跑通过。

# https://github.com/llvm/llvm-project/releases/tag/llvmorg-14.0.6
# 装 clang,这里有官方编译好的,当然也可以用 linux 具体发行版包管理器装,比如 apt install clang。
# 不过,各种知名开源 c++ 项目好多不用包管理器装的 clang,更多的都是用这个官方 github release 里编译好的。
# 本例将 clang 放在了 /opt/llvm,如果非此路径,下文步骤涉及的路径,需要响应调整。

# 清理掉无关构建数据
rm -rf build buildtrees output

# 配置 cmake 参数
cmake -Bbuild -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS="-fsanitize=address" -DCMAKE_C_COMPILER=/opt/llvm/bin/clang -DCMAKE_CXX_COMPILER=/opt/llvm/bin/clang++ -DCMAKE_AR=/opt/llvm/bin/llvm-ar -DCMAKE_LINKER=/opt/llvm/bin/lld -DCMAKE_NM=/opt/llvm/bin/llvm-nm -DCMAKE_OBJDUMP=/opt/llvm/bin/llvm-objdump -DCMAKE_RANLIB=/opt/llvm/bin/llvm-ranlib

# cmake 不透传,需要通过环境变量影响编译行为
export CC=/opt/llvm/bin/clang
export CXX=/opt/llvm/bin/clang++
export LD=/opt/llvm/bin/lld
export NM=/opt/llvm/bin/llvm-nm
export AR=/opt/llvm/bin/llvm-ar
# export CXXFLAGS="-fsanitize=address -stdlib=libc++ -pthread"
export CXXFLAGS="-stdlib=libc++ -pthread"
# export LDFLAGS="-fsanitize=address -stdlib=libc++ -lc++ -lc++abi"
export LDFLAGS="-stdlib=libc++ -lc++ -lc++abi"

# 执行编译
cmake --build build --config Debug

非 macos 复现效果:
image

结论:
需要改 macos ci 构建脚本,加上 CXXFLAGSLDFLAGS 让 pika 依赖库构建时也开 sanitize。

CC:@AlexStocks @Mixficsol

@Mixficsol
Copy link
Collaborator Author

Mixficsol commented Jul 22, 2023

结论:误报

依据:参考文献 image

根因: cmake 参数不透传,就是说 -fsanitize=address 在 pika 本身代码的编译过程生效了。但是在 pika 依赖的各个库,如 rocksdb 等,未透传 -fsanitize=address。结果就是 pika 依赖的各个库没有开 sanitize,pika 自己开了。就踩了参考文献提到的 false-positives

非 macos 复现步骤:

其中 CXXFLAGSLDFLAGS 如果把 -fsanitize=address 去掉,即可复现,即一部分开 sanitize 了(pika 本身),一部分没开(各种依赖库)。如果加上,就能跑通过。

# https://github.com/llvm/llvm-project/releases/tag/llvmorg-14.0.6
# 装 clang,这里有官方编译好的,当然也可以用 linux 具体发行版包管理器装,比如 apt install clang。
# 不过,各种知名开源 c++ 项目好多不用包管理器装的 clang,更多的都是用这个官方 github release 里编译好的。
# 本例将 clang 放在了 /opt/llvm,如果非此路径,下文步骤涉及的路径,需要响应调整。

# 清理掉无关构建数据
rm -rf build buildtrees output

# 配置 cmake 参数
cmake -Bbuild -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS="-fsanitize=address" -DCMAKE_C_COMPILER=/opt/llvm/bin/clang -DCMAKE_CXX_COMPILER=/opt/llvm/bin/clang++ -DCMAKE_AR=/opt/llvm/bin/llvm-ar -DCMAKE_LINKER=/opt/llvm/bin/lld -DCMAKE_NM=/opt/llvm/bin/llvm-nm -DCMAKE_OBJDUMP=/opt/llvm/bin/llvm-objdump -DCMAKE_RANLIB=/opt/llvm/bin/llvm-ranlib

# cmake 不透传,需要通过环境变量影响编译行为
export CC=/opt/llvm/bin/clang
export CXX=/opt/llvm/bin/clang++
export LD=/opt/llvm/bin/lld
export NM=/opt/llvm/bin/llvm-nm
export AR=/opt/llvm/bin/llvm-ar
# export CXXFLAGS="-fsanitize=address -stdlib=libc++ -pthread"
export CXXFLAGS="-stdlib=libc++ -pthread"
# export LDFLAGS="-fsanitize=address -stdlib=libc++ -lc++ -lc++abi"
export LDFLAGS="-stdlib=libc++ -lc++ -lc++abi"

# 执行编译
cmake --build build --config Debug

非 macos 复现效果: image

结论: 需要改 macos ci 构建脚本,加上 CXXFLAGSLDFLAGS 让 pika 依赖库构建时也开 sanitize。

CC:@AlexStocks @Mixficsol

我也发现了这个问题,目前在Pika的三个环境下的ci我都做了以下的修改,这是你想要加上的吗
截屏2023-07-22 12 27 56

相关的PR

@tedli
Copy link
Contributor

tedli commented Jul 22, 2023

@Mixficsol

#1789 这里,我动了 CMakeLists.txt,要讨论的改动,可以在这个 pr 里 review 讨论。

@Mixficsol Mixficsol reopened this Jul 22, 2023
@Mixficsol Mixficsol reopened this Aug 23, 2023
@Mixficsol Mixficsol changed the title 修复Macos环境下Pika的Ctest报错 修复 Macos 环境下 Pika 的 Ctest 报错 Aug 23, 2023
@Mixficsol Mixficsol changed the title 修复 Macos 环境下 Pika 的 Ctest 报错 修复 Pika 的 Ctest 报错 Aug 23, 2023
@Mixficsol Mixficsol added the bug label Aug 23, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants