公众号
欢迎投稿,推荐或自荐文章/软件/资源等
可以贴在下一期草稿里 草稿链接
1202
编译器信息最新动态推荐关注hellogcc公众号 本周更新 2022-11-30 第178期
离谱,freebsd的ping 有溢出漏洞
关键字 | 放在变量前 | 放在static/thread_local前 | 放在函数前 | 常量表达式前 |
---|---|---|---|---|
const | 可以 | 可以 | 成员函数 | 有时可以 |
constexpr | 可以 (初始化得是constexpr的) | 可以 | 必须是满足constexpr属性的函数 | 可以 |
consteval | 不行 | 不行 | 满足consteval的函数 | 接受返回值,可以 |
constinit | 不行 | 必须常量初始化 | 不行 | 不行 |
未定义行为
不一定是实现决定,未定义行为
就是 未定义行为
, 就是可能任何事都会发生,别想当然
列了一堆c的资料以及语法细节
[[nodiscard]] constexpr auto if_hell(bool c1, bool c2) {
if (c1) {
if (c2) {
return true;
} else {
throw;
}
}
// ...
return false;
}
static_assert(not if_hell(false, false));
static_assert(not if_hell(false, true));
assert(throws([]{ if_hell(true, false)); }));
static_assert(if_hell(true, true));
[[nodiscard]] constexpr auto if_heaven(bool c1, bool c2) {
if (not c1) {
return false;
}
if (not c2) {
throw;
}
// ...
return true;
}
static_assert(not if_heaven(false, false));
static_assert(not if_heaven(false, true));
assert(throws([]{ if_heaven(true, false)); }));
static_assert(if_heaven(true, true));
别写if_hell这种面条。尽量提前结束
看代码
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
uint8_t tab[0x1ff + 1];
uint8_t f(int32_t x)
{
if (x < 0)
return 0;
int32_t i = x * 0x1ff / 0xffff;
if (i >= 0 && i < sizeof(tab)) {
printf("tab[%d] looks safe because %d is between [0;%d[\n", i, i, (int)sizeof(tab));
return tab[i];
}
return 0;
}
int main(int ac, char **av)
{
return f(atoi(av[1]));
}
一个经典UB,既然溢出是UB,那么GCC就假定永远不会溢出,这里的条件判断统统删除,所以执行一个溢出的数,直接coredump
大家有时间可以读一下UB指南 https://blog.regehr.org/archives/213 没工夫读的,我总结一下
说过挺多次了。就是有些场景引用可能带来副作用,对于引用主动decay copy成值语义
讲反射的。代码写的和boost.fpr(magic_get)
差不多吧
用静态分析抓bug。场景都特简单
int main() {
std::vector<int> data{ 1,1,2,3,5,8,13,21,34,55 };
for (auto it = data.begin(); it != data.end();) {
/* do something with *it */
if (*it % 2 == 0) {
data.erase(it);
} else {
++it;
}
}
for (auto const& e : data)
std::cout << e << '\n';
}
问题出在哪里?入门级
代码写错,
if (memcmp(m_result_original, m_result_my_version, sizeof(struct tmp))!=0)
if (memcmp(m_result_original, m_result_my_version, sizeof(struct tmp)!=0)) //括号匹配错了
第二种写法gcc告警很不清晰
2.c:17:72: warning: size argument in 'memcmp' call is a comparison [-Wmemsize-comparison]
if (memcmp(m_result_original, m_result_my_version, sizeof(struct tmp)!=0))
~~~~~~~~~~~~~~~~~~^~~
2.c:17:7: note: did you mean to compare the result of 'memcmp' instead?
if (memcmp(m_result_original, m_result_my_version, sizeof(struct tmp)!=0))
^ ~
)
2.c:17:54: note: explicitly cast the argument to size_t to silence this warning
if (memcmp(m_result_original, m_result_my_version, sizeof(struct tmp)!=0))
^
(size_t)( )
1 warning generated.
这种问题怎么规避?
介绍oilpan的。一个GC框架,Chrome V8引入这个GC,又支持了pointer compression 指针压缩。指针48位明显用不完,olipan搞到了32位,还有压缩空间
讲windows API的。没怎么看懂。Raymond Chen高产似母猪啊
看不懂
代码在这里 https://github.com/stdgraph/graph-v2
老哥非常乐观
还能这么玩???
开始刷leetcode了。现在工作真卷啊,算法题我都忘光了