V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  geelaw  ›  全部回复第 153 页 / 共 177 页
回复总数  3536
1 ... 149  150  151  152  153  154  155  156  157  158 ... 177  
@SuperMild 那你没有理解我想表达的——因为从样子上看你可以把“算法”写进“密钥”,比如我提到用 UTM,密钥是两对算法,这样这句话就不直觉成立了。

这篇文章的主要目的是解决什么属于这个语境里面的“算法”(需要保密的东西)。
@momocraft
@fucker

下面四个命题有一个是真的:

- 英语发音错误;
- 汉语发音错误;
- 没有把域名用英语读;
- 说的不是普通话或者粤语。

Gee Law,普通话的“基佬”和粤语的“基佬”的发音都有巨大区别,不可能弄错。

英语 Gee Law /dʒiː lɔː/

普通话 基佬 /tɕi1 lɑʊ̯3/

粤语 基佬 /keɪ̯1 lɤʊ̯2/


对别人的名字品头论足是一件很不礼貌的事情;即使最初我觉得这个解释很有趣,我也会觉得厌倦——这个梗已经存在至少 7 年了。
2017-06-24 19:09:03 +08:00
回复了 NullMan 创建的主题 C C 语言:释放动态分配的内存,为何还能访问?
@bp0

这个方法的可移植性 和 程序的可移植性 没什么关系,因为这个玩意儿是给 **调试** 用的。正常使用(而不是调试程序)的时候不会应用这个策略。

这里的“让它 crash ”是在调试阶段暴露问题,在生产阶段,因为一些优化的考虑,不可能做这么多防御措施。

如果你在书写可移植的代码,那么你可以在一个有这个调试功能的平台上完成调试之后到其他平台用。


@VYSE

(所以 0xdeadbeef 不能 mmap ?我不用 *nix 不太懂。)


@VYSE
@wind3110991

如果有两个指针指向同一个动态分配地址,那么仅仅设置一个指针为 nullptr 或者一个特殊的数是没有用的。

这种情况或许容易检测,但是更困难的是,你分配了一个数组,两个指针一个指向数组开头,一个指向数组里的另一个位置,然后你 free 数组开头并重置指针——这样虽然后一个指针并不等于被释放的指针,仍然变得无效。
2017-06-24 00:31:40 +08:00
回复了 NullMan 创建的主题 C C 语言:释放动态分配的内存,为何还能访问?
@bp0 因为在这个模式下,如果你释放内存,整个 page 都会变得 invalid,就好像这个 page 从没用到过一样(但是 heap manager 会避免过早再次使用这个 page )。

举个例子,第一次分配 1 Kb,记在 p 里面,第二次又分配 1 Kb,记在 q 里面,假设第二次分配的那 1 Kb 在第一次后面那一个 page。

做这个:free(q); printf("%c\n", *q);
相当于:free(q); printf("%c\n", *(p + PageSize));

把 q 释放之后访问 q,是访问无效的 page,这里效果上等于 p buffer overrun,是会被检查到的。

至于一个 page 具体是怎么被 decomitted 的,这我并不关心。

**此外,free 掉一个指针之后设置为 nullptr,不代表原来其他指向它(或者这个数组其他位置)的指针也变成了 nullptr。**

如果你可以把所有和这块内存关联的指针都找到并设置为 nullptr,那恐怕是可以的——但是这样的入侵性很强,还有可能让你不知道什么时候一个指针就被篡改了。

至于一个 malloc 的实现可以抵抗双重释放,不代表书写双重释放的代码是可以接受的——这样的代码不可移植,而且在地址被重新利用的时候会引发更加糟糕的错误。彻底解决的方法是杜绝程序有逻辑问题,而不是掩盖这个问题。

扩展阅读
https://stackoverflow.com/questions/1879550/should-one-really-set-pointers-to-null-after-freeing-them
https://stackoverflow.com/questions/1025589/setting-variable-to-null-after-free
2017-06-23 23:52:18 +08:00
回复了 NullMan 创建的主题 C C 语言:释放动态分配的内存,为何还能访问?
@tyfulcrum 取决于逻辑,不能一概而论,所以我说“任何情况(也就是不考虑具体情况)都在 free 之后立刻设置为 nullptr ”是不好的。
2017-06-23 23:50:37 +08:00
回复了 NullMan 创建的主题 C C 语言:释放动态分配的内存,为何还能访问?
@bp0 如果你认真读了那篇内容你会发现释放之后再访问也会出错,因为页面已经被 decomitted。这是一个调试功能,所以效率低一点并没有什么问题。

双重释放会导致堆损坏,而且双重释放是会导致访问已经释放的内存的——比如第一次释放后那个地址被分配给别人之后再第二次释放,实际拥有者不知道这个内存已经被扔了,再次访问就会有坏事发生。
2017-06-23 22:49:28 +08:00
回复了 NullMan 创建的主题 C C 语言:释放动态分配的内存,为何还能访问?
@bp0 如果你开启页末对齐,则你并不需要赋值为 nullptr 也能看出错误。参考 https://blogs.msdn.microsoft.com/oldnewthing/20170410-00/?p=95935

如果你设置为 nullptr,你就没法发现双重释放的错误。
2017-06-23 21:42:01 +08:00
回复了 NullMan 创建的主题 C C 语言:释放动态分配的内存,为何还能访问?
@catror 没有区分 dangling pointer 和 uninitialised pointer 的必要——它们都存储着无效的值。
2017-06-23 21:41:24 +08:00
回复了 NullMan 创建的主题 C C 语言:释放动态分配的内存,为何还能访问?
@catror free(nullptr) 是没有任何效果的,不要想当然。
2017-06-23 20:43:16 +08:00
回复了 NullMan 创建的主题 C C 语言:释放动态分配的内存,为何还能访问?
@catror

举个例子来说,正是因为这里的指针没有意义了,下次使用就可能出错(有些调试器允许你检测到这种情况),所以这样可以看出程序的逻辑错误。在 free 之后无论是什么情况都立刻把指针设置为 nullptr 是一种鸵鸟战术,就像是在所有指针访问之前都测试是不是 nullptr 一样——对于本来不该是 nullptr 的指针,测试是不是 nullptr 并不能解释为什么这个指针变成了 nullptr。
2017-06-23 19:21:40 +08:00
回复了 NullMan 创建的主题 C C 语言:释放动态分配的内存,为何还能访问?
@catror 这样做反而可能错失发现逻辑错误的机会。

这个行为是符合标准的,因为标准说未定义,你能用可以算是一种走运。
2017-06-23 19:18:49 +08:00
回复了 tianxiacangshen 创建的主题 PHP 每个月自动执行一次某程序,什么样的方法最简单?
@xcatliu 弊端是怀孕、更年期或月经不调的时候就会忘记这事
答案是因为 Users 组默认包括 Authenticated Users 和 Interactive,所以任何验证过的用户都会进入 Users 组。

你可以通过 whoami /all 查看自己属于哪些安全实体。
2017-06-23 16:56:55 +08:00
回复了 tttttttt 创建的主题 问与答 关于如何抓取大牛博客更新内容
如果主页是高度语义化的,可以通过看这个页面完成。还可以用 RSS、动态磁贴追踪。
2017-06-23 08:42:27 +08:00
回复了 silenM 创建的主题 程序员 黑客与画家。。。
> 编程语言是用来帮助思考程序的,而不是用来表达你已经想好的程序。

这句话可以对也可以不对,因为你可以用一种语言来想程序,你可以把这种语言(即使是自然语言)定义为一种“编程语言”。

敲出来的文字和脑子里想的文字,区别不过是打草稿 / 写试卷和心算。
2017-06-22 08:26:43 +08:00
回复了 geelaw 创建的主题 旅行 如何 (错误地) 接待家长到自己学习的地方玩
@DeutschXP 我的坑爹运营商还没有免费,而且免漫游法令是七月才生效。我今年第一次准备去巴黎的时候就知道这个惨痛的事情了。
2017-06-22 05:06:50 +08:00
回复了 NullMan 创建的主题 C C 语言题目,造轮子,看谁的轮子最厉害,有牛奶奖励。
如果你只要删除第一个匹配,可以只用一个 explicit 变量,用一个 int 作为匹配长度的记录,当找到匹配的时候,循环利用 pattern 指针作为复制源位置即可。
2017-06-22 04:59:54 +08:00
回复了 NullMan 创建的主题 C C 语言题目,造轮子,看谁的轮子最厉害,有牛奶奖励。
另外没有理解“请你喝牛奶”是什么玩意儿
2017-06-22 04:58:47 +08:00
回复了 NullMan 创建的主题 C C 语言题目,造轮子,看谁的轮子最厉害,有牛奶奖励。
```c
/* 删除所有的匹配 */
void del_substr(char *str, char const *pattern)
{
char const *copy = str;
int match;
if (!str || !pattern || !*pattern)
return;
while (*copy)
{
for (match = 0; copy[match] && copy[match] == pattern[match]; ++match)
;
if (pattern[match]) *str++ = *copy++;
else copy += match;
}
*str = 0;
}
```

懒得验证了

限制于空间要求,没法写更聪明的代码,这个算法非常地慢
2017-06-21 21:59:26 +08:00
回复了 geelaw 创建的主题 旅行 如何 (错误地) 接待家长到自己学习的地方玩
@Weny
@Thoxvi

在大多数位置是一样的,还有一个版本是 MS-DOS Mobile 的像素化相机的版本
1 ... 149  150  151  152  153  154  155  156  157  158 ... 177  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1182 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 49ms · UTC 17:48 · PVG 01:48 · LAX 09:48 · JFK 12:48
Developed with CodeLauncher
♥ Do have faith in what you're doing.