【apache ant 源码】【云够源码】【facenet官方源码】james 项目源码_项目源码下载

时间:2024-12-28 10:40:00 来源:libstdc 源码 分类:热点

1.performance.timerify的bugs
2.知名压缩软件xz被发现有后门,目源码项目源码下影响有多大?如何应对?
3.James A. Woods全部作品

james 项目源码_项目源码下载

performance.timerify的bugs

       Node.js实现W3CperformanceAPI已经有一段时间了,最近我发现Node.js还提供了方便的HistogramAPI,可得到平均值、最小值、最大值,中位数或指定的百分位、标准差等。对于常见的函数执行时间的统计需求,可以:

import?{ performance,?createHistogram}?from?'perf_hooks'const?histogram?=?createHistogram()const?wrapped_fn?=?performance.timerify(fn,?{ histogram})doSth(wrapped_fn)?//?内部可能多次调用?wrapped_fnconsole.log(histogram.count,//?采样次数?histogram.min,//?最小值histogram.percentile(),?//?中位值histogram.mean,?//?平均值histogram.stddev,?//?标准差)

       performance.timerify(fn,{ histogram})(Node.jsv+)生成一个包装函数,每次调用会对fn的执行计时(单位为纳秒)并将耗时写入histogram。看上去这个API用来做microbenchmark还是很方便的。

       ç„¶è€Œæˆ‘在使用的时候遇到了bug——fn的返回值如果是primitive值,包装函数的返回值会变成一个空对象。我当时写了个fn会返回null,它给我偷换成了个对象,自然把程序搞挂了。

       ç ”究了一番后,我发现如果fn是普通函数(即functionfn(){ }),会总是以newfn方式调用。

       åˆ°Node.js仓库里查找了一番,已经有人发了Issue#。也有试图修复的PR#,但一直没有被合进去,因为其修复方式并不合理。

       ä»Žè®¨è®ºä¸­å¯è§ï¼ŒåŽŸä½œè€…的意图是,如果是构造器,那么就new之,于是写了类似IsConstructor(fn)?newfn(...args):fn(...args)的逻辑,但忘记了普通函数也是构造器。

       ã€æ‰€ä»¥æœ‰ä¸ªworkaround就是写成箭头函数——箭头函数不是构造器。】

       PR则改为了类似IsClass(fn)。但这导致传统的非class的构造器就不会以new方式调用了。尽管ES6之后绝大部分新代码都已经用class了,但总还是有老代码。另外还有一种情况是,代码本身是以class写的,但是可能发的包仍然是被编译成ES5了。

       ã€æ­¤å¤–,该PR的IsClass的判断是通过/^\s*class/.test(fn.toString())这样的hack方式,并不靠谱。比如内建构造器的toString()结果并不会以"class"开头;又比如,按照目前stage3的decorator提案,被decorator所修饰的class的toString()结果会包含decorator(也就是以"@decoclass"开头);未来也可能包含其他修饰关键字(比如abstract、async、final、static等)。】

       å®žé™…上,合理的逻辑并不是检查fn是否是构造器,而应是原样传递语义——包装函数在这里应该是一个代理。

       å‡å¦‚用Proxy实现的话是很简单的,大体如下:

function?timerify(fn)?{ return?new?Proxy(fn,?{ construct(...args)?{ const?start?=?now()const?result?=?Reflect.construct(...args)processComplete(start)return?result},apply(...args)?{ const?start?=?now()const?result?=?Reflect.apply(...args)processComplete(start)return?result},}}

       ä¸è¿‡æˆ‘们可能并不想用proxy。(比如担心proxy的性能?可能阻止内联?)

       å¦‚果直接写包装函数应该怎么写呢?

       é€»è¾‘上是IsNew?newfn(...args):fn(...args),IsNew表示当前执行函数是否是以new调用的,但IsNew如何写?

       ä¼ ç»Ÿä¸Šï¼Œæˆ‘们可以用instanceof来判定:

function?timerify(fn)?{ return?function?timerified(...args)?{ const?start?=?now()const?result?=?this?instanceof?timerifiednew?fn(...args)?:?fn.call(this,?...args)processComplete(start)return?result}}

       ä¸è¿‡çŽ°åœ¨å¯ä»¥ç¥­å‡ºæ›´ç²¾ç¡®çš„new.target这个元属性(metaproperty):

function?timerify(fn)?{ return?function?(...args)?{ const?start?=?now()const?result?=?new.targetReflect.construct(fn,?args,?new.target):?Reflect.apply(fn,?this,?args)processComplete(start)return?result}}

       ã€æ³¨æ„Reflect.construct的第三个参数,在当前实现中是没有传递的。这意味着当前实现也不能正确处理子类继承如classXextendstimerify(Base)的情形。】

       æ›´è¿›ä¸€æ­¥è¯´ï¼Œtimerify最好和Function.prototype.bind一样,如果fn不是构造器,返回的包装函数也不是构造器。

       ã€è¦è¿”回一个非构造器的函数,可以使用一个偏门小技巧——简写形式方法不是构造器,所以可以写成:return{ fn(){ ...}}.fn。】

       PS.在研究这个bug时,我查看了timerify源码,并发现了另外两个bug?,于是去开了issue。

       ç¬¬ä¸€ä¸ªissue是performance.timerify(fn,options)alwaysreturnthesametimerifedfunction·Issue#·nodejs/node。

       å½“前实现画蛇添足地做了缓存,即多次timerify(fn)的结果返回同一个函数。然而我们可能有需求要为同一个fn产生多个包装函数,比如为相同函数在不同场景的使用生成不同的统计函数:

let?h1?=?perf_hooks.createHistogram()let?h2?=?perf_hooks.createHistogram()let?f1?=?perf_hooks.performance.timerify(f,?{ histogram:?h1})let?f2?=?perf_hooks.performance.timerify(f,?{ histogram:?h2})f1?!==?f2?//?expect?true,?actual?false

       ç»“果调用f2的用时数据并不会写入h2,而是也写入了h1。

       ç¬¬äºŒä¸ªissue是performance.timerify(fn)behaveinconsistentlyforsync/asyncfunctions·Issue#·nodejs/node。

       timerify对异步函数(或所有返回promise的函数)做了特殊处理,计时不是到函数调用结束(返回promise)之时,而是到promise完成之后。这符合大部分使用者的直觉。但当前实现不是使用then调用,而是再次画蛇添足地使用了finally调用。Promise.prototype.finally会确保无论成功失败总是调用,看上去似乎更「安全」,但实际上在这里使用finally,会导致异步函数和非异步函数调用结果不一致。因为包装函数调用fn时并没有使用try...finally构造,如果throw,则并不会对本次调用完成计时。

       ä¸ºäº†ç¡®ä¿ä¸€è‡´ï¼Œè¦ä¹ˆéƒ½ä¸ç”¨finally,要么都用finally。事实上,之所以promise上的这个方法命名为finally,也是在提示这个方法和try...finally的对应性。然而在本例中还是被无视了……

       é‚£ä¹ˆåˆ°åº•æ˜¯å¦åº”该用finally呢?不应该用。因为我们计时是希望测量函数的运行时间,throw或reject表明并没有完成函数的正常计算逻辑,不符合我们的统计目标,不应该被计时。

       ã€å³ä½¿è¦ç”¨finally,当前实现中的逻辑if(result?.finally)result.finally(...)也是有问题的。因为promise或所谓thenable的标志是then方法而不是finally方法。依赖finally方法就和上面提到的依赖toString的结果一样不严谨。】

       æ€»ç»“:写代码要做到严谨是不容易的。即使是Node.js这样的明星项目,即使是出自JamesMSnell这样的资深程序员之手,即使是一个并不算太复杂的API,即使只有行代码……也可能潜藏各种问题。

       ã€å½“然,我们可以喷Node.js的代码质量也不过尔尔;其实就算JS引擎代码,也经常出bug(如/post/

知名压缩软件xz被发现有后门,影响有多大?如何应对?

       知名压缩软件xz被发现存在后门,这一问题的目源码项目源码下揭露是由Andres Freund发现sshd进程的CPU占用率异常后进行的深入调查所促成的。

       对比分析有后门的目源码项目源码下m4脚本与原版,很难发现其中存在的目源码项目源码下问题。然而,目源码项目源码下通过执行命令`grep -aErls "#{ 4}[[:alnum:]]{ 5}#{ 4}$" ./`在源码根目录下,目源码项目源码下apache ant 源码发现执行结果指向了`./tests/files/bad-3-corrupt_lzma2.xz`文件。目源码项目源码下这个步骤揭示了文件名虽不直接明文出现在构建脚本中,目源码项目源码下但通过`grep`命令间接匹配并确认了恶意文件的目源码项目源码下存在。

       进一步分析表明,目源码项目源码下`gl_[$1]_prefix=echo $gl_am_configmake | sed "s/.*\.//g"`这一行代码提取了恶意文件的目源码项目源码下扩展名`xz`,实际上对应于`xz`命令行工具的目源码项目源码下名称。这暗示了解压过程需要先安装`xz-utils`包。目源码项目源码下整个解压命令的目源码项目源码下执行环境主要针对Linux系统,而非非Linux系统。目源码项目源码下

       该脚本通过寻找并读取`config.status`文件来获取源码的根目录,这一过程考虑到许多发行版在编译时会单独建立`build`目录,因此`srcdir`变量保存了源码的位置。然后通过`export`命令随机读取内容,最终执行了一系列命令,其中包含多个行为,云够源码揭示了即使在非Debian或RPM系发行版中,尝试在`make`后再次执行`configure`时,也会通过其他途径执行感染。

       对于Debian或RPM系发行版,恶意代码通过将上述恶意脚本注入到`Makefile`中实现,这个过程依赖于源码编译完成后才能进行。而真正感染部分在于将原本应编译自特定源文件的`liblzma_la-crc_fast.o`和`liblzma_la-crc_fast.o`目标文件链接为恶意对象文件,同时替换指令集扩展检测函数。正确的`get_cpuid`原型被故意修改,其中`__builtin_frame_address`旨在获取函数返回地址,facenet官方源码这可能在`x_`Linux上用于在寄存器中留下特定地址。

       值得注意的是,发布带有后门的作者Jia Tan曾在两个月前与Sam James讨论过与GCC相关的bug导致`ifunc`函数符号覆盖功能不正确的问题,最终确认了这是一个GCC的bug。

       提交代码时的实名要求对项目维护具有重要意义,尤其是当代码引发法律问题时。在Linux等重要项目中,有提交权限的人通常被强制要求实名。通过“签核”程序,开发者需在补丁说明末尾添加证明其身份的闪电砍价源码一行,确保贡献的合法性和追踪性。

       项目中采用的签署选项有助于确定提交者和审查者的身份。在更严格的场合,代码提交可能需要使用GPG签名,而线下会议可能举办Key signing party来交换GPG公钥,确保线上身份与现实一致,并获得其他人的承认。实名制是维护代码质量和法律责任的关键,虚拟人物或匿名用户无法承担相应的法律责任。

James A. Woods全部作品

       James A. Woods是代码美化 源码一位活跃在影视界的演员,他的作品丰富多样,涵盖了从早期到晚期的多个年份。以下是他的主要作品列表:

       年,他参与了**《源代码》的演出。

       年,他主演了**《重回昨日》。

       年,他在《死亡地带》中的表现也得到了认可。

       年,他以演员的身份出演了《基情二加一》。

       年,他参与了《乞赎的灵魂》的拍摄。

       紧接着,他在年的《邪恶的永生》中也有精彩的表现。

       年,他主演了《杰克·布鲁克斯之怪兽杀手》。

       同一年,他还参与了**《Housesitter》的演出。

       年,他在《Lance et compte》中的角色令人印象深刻。

       年,他再次出演了《Big Wolf on Campus》。

       年,他主演了续集**《Lance et compte: Le grand duel》。

       年的《Naked Josh》是他作品中的一部。

       年,他首次在**节上亮相,参与了《**节初哥》的演出。

       年的《A Near Death Experience》也是他作品库中的一部分。

       年的《生命交叉点》展示了他多面的角色诠释。

       年的《Cyber Seduction: His Secret Life》是他数字化角色的代表作。

       年的《Seriously Weird》则展现了他早期的演技魅力。

       年,他在商业片《生意》中留下了足迹。

       年的《The Watch》是他近年来的一部重要作品。

       最后,在年的《Hatley High》中,他的表演同样引人关注。

       James A. Woods通过这些作品积累了丰富的演艺经验,展示了他在不同角色中的精湛演技。