V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  geelaw  ›  全部回复第 152 页 / 共 177 页
回复总数  3521
1 ... 148  149  150  151  152  153  154  155  156  157 ... 177  
2017-06-24 20:17:24 +08:00
回复了 hoythan 创建的主题 问与答 评论数组快速归类的方法
/* in-place, destructive */
function treefy(inputArray)
{
var outputArray = [];
inputArray.forEach(function (comment) { comment.comments = []; });
inputArray.sort(function (a, b) { return a.commentID - b.commentID; });
var helper = function (begin, end, n)
{
if (begin >= end) return null;
var mid = (begin + end) >> 1;
var testee = outputArray[mid].commentID;
return testee < n ? helper(begin, mid, n) : testee > n ? helper(mid + 1, end, n) : outputArray[mid];
};
inputArray.forEach(function (comment)
{
if (comment.comment_parentID == 0) outputArray.push(comment);
else helper(0, inputArray.length, comment.comment_parentID).comments.push(comment);
});
return outputArray;
}

没有测试过, provided as-is.
2017-06-24 20:09:23 +08:00
回复了 guyeuro 创建的主题 问与答 黑客是如何利用所谓的“进程内存转储”偷密码的?
实际上可以直接用 Process Explorer 查看进程里面长得像字符串的东西,这也是可能看到密码的。


@ech0x 但是 char[] 是可变的,因此你可以用完之后手动填充为空白。这样做是为了保证用完之后内存里不再有这个串。

然而很糟糕的是,对于复制 GC 这一招还是会被攻击。


@nevin47 如果没有解密私钥的密码怎么解密私钥……?而且要用的时候仍然需要把私钥解密。
2017-06-24 20:03:36 +08:00
回复了 1oNflow 创建的主题 程序员 回复邮件的标题该怎么写?要不要附带每次对话原文?
正确的实现是,如果标题以任何语言的“回复”“转发”加上冒号开始,则先去掉,看作标题,然后加上当前语言的“回复”“转发”和冒号。

在回复邮件的时候带上全文是正确的,一些客户端具有“打开对话中一条消息”的功能,如果你不加上全文就会导致读对话很麻烦;一个聪明的移动客户端也会在阅读对话的时候自动隐藏引用内容(对于桌面客户端,没这个必要,因为一个对话里面的邮件不是摞在一起的,而是左边有个列表让你选)。
2017-06-24 19:32:31 +08:00
回复了 wangzhangup 创建的主题 站长 .ai 的域名怎么注册
@tony1016

Euh... 深入浅出 和 太深 似乎不矛盾 - - 原文末我有一个简单的总结的:

> 所有在开始使用算法之前固定的东西都应该当成并且需要公开。

另外这篇文章并不深,这个内容应该是二年级的感悟,我都快四年级了。
@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 创建的主题 程序员 黑客与画家。。。
> 编程语言是用来帮助思考程序的,而不是用来表达你已经想好的程序。

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

敲出来的文字和脑子里想的文字,区别不过是打草稿 / 写试卷和心算。
1 ... 148  149  150  151  152  153  154  155  156  157 ... 177  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3171 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 37ms · UTC 13:59 · PVG 21:59 · LAX 05:59 · JFK 08:59
Developed with CodeLauncher
♥ Do have faith in what you're doing.