fsantinize 弱智

2023-09-16 10:35:49 +08:00
 zzzkkk

fsantinize 还没智能到那种程度 简直给码农添加负担 给一个静态字符数组前面添加几个空格都会报错

请看

图 1

图 2

图 3

编译时报图 3 的错误 运行就报 ==1856626==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7fff15ef59e9 at pc 0x55d429175340 bp 0x7fff15ef5940 sp 0x7fff15ef5938

5388 次点击
所在节点    C++
85 条回复
learningman
2023-09-16 18:41:40 +08:00
https://v2ex.com/t/974127#reply10 楼主不会写反转字符串,开了两个帖子一个骂 c 语言一个骂工具链
learningman
2023-09-16 18:45:51 +08:00
https://v2ex.com/t/853017#reply244 破案了,写 php 的

zzzkkk symfony form choicetype 怎么设置选中项
PHP • zzzkkk • 2021-12-31 18:36:59 PM 忽略
zzzkkk symfony 每次改动 config/services.yml 都加载很慢
PHP • zzzkkk • 2021-12-30 14:47:08 PM • 最后回复来自 zzzkkk 忽略 7
zzzkkk symfony form money type 为什么存到数据库 是价格乘以 100 ?
PHP • zzzkkk • 2021-12-30 15:12:32 PM • 最后回复来自 zzzkkk 忽略 6
zzzkkk symfomy form add field 注解模式 property_path 无效
PHP • zzzkkk • 2021-12-25 20:30:33 PM 忽略
zzzkkk symfony 项目每次改动都要 clear cache?

这是把 V2EX 当 chatgpt 使呢?
zzzkkk
2023-09-16 18:48:05 +08:00
@learningman

我这代码还真把字符串反转了
你有本事写个更高效的出来
zzzkkk
2023-09-16 18:49:54 +08:00
是字符串里的单词顺序反转 不是简单字母反转
zzzkkk
2023-09-16 18:50:41 +08:00
@learningman
你有本事写个更高效的 c 代码出来
zzzkkk
2023-09-16 18:53:01 +08:00
@learningman
没用过的臃肿框架 不知道不是很正常么
vsyf
2023-09-16 19:01:11 +08:00
@zzzkkk #63
@zzzkkk #64
#1
start = s;
while ( *start != '\0') {
start++;
}
--start;

#2
char s2[strlen(s) + 1];

看完前面这几行已经可以优化了,后面不看了 XD
zzzkkk
2023-09-16 19:06:15 +08:00
各位 c c++老鸟 谢谢了 我的确没做过 c c++项目
但是我这个算法还是最好的吧
cnbatch
2023-09-16 19:10:25 +08:00
OP 把系统版本、编译器版本一起发出来吧

我用 GCC 10.2.1 (Debian 11)、GCC 13.2.1 (Fedora 38)和 Clang 14.0.5 (FreeBSD 13.2)都没遇到 OP 主贴图 3 的情况
zzzkkk
2023-09-16 19:24:08 +08:00
@cnbatch

gcc (Debian 10.2.1-6) 10.2.1 20210110

aws 的 tiny instance
Inn0Vat10n
2023-09-16 19:30:27 +08:00
你可以把会导致 sanitizer 报错的代码原样贴出来,大家来一起帮你数一数到底有多少个字符
https://godbolt.org/
ProPh3t
2023-09-16 19:35:11 +08:00
误以为进了民科吧
zzzkkk
2023-09-16 20:12:00 +08:00
@Inn0Vat10n

哎呀 不知怎么回事 刚才好像是一条 printf 语句到了 sanitize 问题

现在改成这样 在 linux 上能运行了 但在 leetcode 上还不能运行

https://godbolt.org/z/M7Wq9hddP
lixile
2023-09-16 20:48:26 +08:00
属实是看不下去了 sanitizers 系列工具 已经是误报率非常低的动态扫描方式了,楼主几乎在重复在类似的问题上犯错
不好好看文档 就上
所有动态扫描的编译选项不会用在正常的软件上开启 仅仅在需要的时候开启
另外如果想让扫描结果 尽可能准确 需要添加回溯和调试的编译选项
-fno-omit-frame-pointer -g
多看看官方文档吧
https://github.com/google/sanitizers/wiki/AddressSanitizer
ajaxgoldfish
2023-09-16 21:07:24 +08:00
楼主可能的理论基础不够强,以为编译过就是合法的代码,其实这是编译器帮你做的优化,举个你刚才的例子在栈中开辟数组要指定大小,而且还的是字面量或者 const 量,但是在高版本 gcc 或者高版本 msvc 中编译器会在编译阶段计算出并给你填上。建议使用低版本的编译器来学习 C++
haohaolee
2023-09-16 22:08:57 +08:00
楼主你可以用 rust 去刷 leetcode ,性能不输 C++,而且不会随便就 runtime 报错
cnbatch
2023-09-16 23:11:24 +08:00
@haohaolee OP 贴出来的报错明显是编译期警告(连报错都不是),一看就知道不是 runtime 报错
zzzkkk
2023-09-16 23:21:31 +08:00
@cnbatch
是运行时报错 没贴上来

是一个 stack buffer overflow 类似的 santinize 产生的
zzzkkk
2023-09-16 23:26:59 +08:00
@cnbatch
你把这里的 reversWords 贴到 leetcode cn 好像第 141 题它还报错 但是在 linux 编译 已经可以运行了

https://godbolt.org/z/M7Wq9hddP
qbqbqbqb
2023-09-16 23:40:54 +08:00
@zzzkkk 这不算最好的算法,太繁琐了。

最方便的写法是:全句字母反转 + 每个单词内部字母反转 = 单词顺序反转

全句字母反转,只要遍历一遍就可以
然后再对每个单词内部字母反转,只要正序抠单词,顺便去空格

比你倒着抠单词方便太多

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/974343

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX