c++ - 函数在不同的配置上返回不同的值
问题描述
这是我的代码片段:
int fastcmp(const void* ptr1, const void* ptr2, size_t size)
{
if (ptr1 == ptr2) return 0;
if (!ptr1 || !ptr2) return -1;
size_t remain = size;
if (size >= 8)
{
remain = size % 8;
size_t work = size / 8 + 1;
auto p1 = (const uint64_t*) ((const uint8_t*)ptr1 + remain);
auto p2 = (const uint64_t*) ((const uint8_t*)ptr2 + remain);
while(--work > 0)
if(p1[work] != p2[work]) return -1;
}
auto p1 = (const uint8_t*) ptr1;
auto p2 = (const uint8_t*) ptr2;
while(remain-- > 0)
if (p1[remain] != p2[remain]) return -1;
return 0;
}
int main(int argc, char* argv[])
{
if (argc == 3)
{
size_t len1 = strlen(argv[1]);
size_t len2 = strlen(argv[2]);
if (len1 == len2)
{
std::cout << "fastcmp returns:" << fastcmp(argv[1], argv[2], len1) << std::endl;
std::cout << "memcmp returns:" << memcmp(argv[1], argv[2], len1) << std::endl;
}
}
return 0;
}
所以我在 mingw 的 vscode 和 g++ 中使用 coderunner。我设置了两个参数完全相同的launch.json。运行调试,函数返回 0。之后我用 g++ 编译它并尝试使用终端运行,其 args 与我在 launch.json 中编写的相同。但函数返回 -1。有人可以解释为什么吗?谢谢,这让我很困惑。
如果 strlen > 8,fastcmp 返回 -1
g++ -std=c++11 foo.cpp -o foo
解决方案
在fastcmp 中只需替换
size_t work = size / 8 + 1;
经过
size_t work = size / 8;
和
while(--work > 0) {
经过
while(work-- != 0) {
否则,您查看索引 n..1 而不是 n..0,因此您不会检测到剩余+0..7 个字符的差异
(注size_t
未签名)
请注意,您假设您可以从任何对齐方式读取uint64_t,从偏移量 0 读取而不是保持更安全(其中的字符串argv[i]
对齐以与任何数字大小兼容),无论如何,正如您在备注中所说的那样,您有严格的别名违反规则和您的行为差异是未定义行为的结果
推荐阅读
- google-cloud-platform - 在 Google PubSub Pull 中收到订阅者数据后回复消息
- javascript - window.addEventListener 没有按预期更新状态
- javascript - 使用甜蜜警报时出现错误“未捕获的类型错误:无法将类作为函数调用”2
- java - 如何在 Java 中编写 adb shell 命令
- twitter-oauth - Twitter API 1.1 在发送 INIT 命令以启动视频上传过程时返回身份验证错误(错误 32)
- laravel - laravel 8中雄辩的铸造数组
- javascript - 如何使用大写/小写
- docker - 当集群在 WSL 2 下运行时从 windows 10 访问 kubernetes 外部 IP (LoadBalancer)
- java - OAuth 2 令牌的 EWS 错误远程服务器返回错误:(401)未授权
- python-3.x - 如何使用python从csv文件的所有列中过滤字符串