Code For Colorful Life
golang中的赋值
先看看文档中关于赋值的说明Assignability:
A value x is assignable to a variable of type T (“x is assignable to T”) in any of these cases:
- x’s type is identical to T.
- x’s type V and T have identical underlying types and at least one of V or T is not a named type.
- T is an interface type and x implements T.
- x is a bidirectional channel value, T is a channel type, x’s type V and T have identical element types, and at least one of V or T is not a named type.
- x is the predeclared identifier nil and T is a pointer, function, slice, map, channel, or interface type.
- x is an untyped constant representable by a value of type T.
Read more...
PHP 7 中函数调用的实现
先看一个函数调用的OPCode:
function foo($arg) {
echo $arg;
}
$arg = "Hello World\n";
foo($arg);
filename: /home/roketyyang/test.php
function name: (null)
number of ops: 6
compiled vars: !0 = $arg
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
2 0 E > NOP
5 1 ASSIGN !0, 'Hello+World%0A'
6 2 INIT_FCALL 'foo'
3 SEND_VAR !0
4 DO_UCALL
5 > RETURN 1
filename: /home/roketyyang/test.php
function name: foo
number of ops: 3
compiled vars: !0 = $arg
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
2 0 E > RECV !0
3 1 ECHO !0
4 2 > RETURN null
第一个OPArray是/home/roketyyang/test.php
文件的,第二个OPArray是foo函数的。
我们来看下/home/roketyyang/test.php
是如何被Zend引擎执行的。
Read more...
认识PHP 7虚拟机
本文内容大部分翻译自Getting into the Zend Execution engine (PHP 5),并做了一些调整,原文基于PHP 5,本文基于PHP 7。
PHP : 一门解释型语言
PHP被称为脚本语言或解释型语言。为何? PHP语言没有被直接编译为机器指令,而是编译为一种中间代码的形式,很显然它无法直接在CPU上执行。 所以PHP的执行需要在进程级虚拟机上(见Virtual machine中的Process virtual machines,下文简称虚拟机)。
PHP语言,包括其他的解释型语言,其实是一个跨平台的被设计用来执行抽象指令的程序。PHP主要用于解决WEB开发相关的问题。
诸如Java, Python, C#, Ruby, Pascal, Lua, Perl, Javascript等编程语言所编写的程序,都需要在虚拟机上执行。虚拟机可以通过JIT编译技术将一部分虚拟机指令编译为机器指令以提高性能。鸟哥已经在进行PHP加入JIT支持的开发了。
Read more...
转义序列导致的XSS注入
问题示例代码
出现xss注入的视图页面部分代码:
<script>
window.onload = function () {
var url = '<?php echo htmlspecialchars($_GET['url']); ?>';
div = document.createElement('div');
div.innerHTML = '<iframe src="' + url + '"></iframe>';
document.body.appendChild(div);
}
</script>
Read more...
静态库与动态库
学习自:《程序员的自我修养》和Static, Shared Dynamic and Loadable Linux Libraries
在Linux下有两种类型的C/C++库:
静态库:以lib{name}.a命名,会被链接为可执行文件的一部分。
被动态链接的共享库(以下简称动态库):以lib{name}.so命名,可执行文件运行时才进行链接,称为动态链接。链接的方式有:
- 动态链接器在可执行文件真正开始运行前,链接动态库;
- 动态连接器在可执行文件运行过程中,链接动态库,又称为延迟绑定,是为了避免程序在启动时就链接了所有依赖的库,等到真正需要的时候才进行链接;
- 可执行文件运行过程中,调用
dlopen()
系统调用链接动态库,又称为运行时装载,PHP的扩展就是通过该方式加载的。
Read more...
C开发时遇到一些问题
1、局部变量的地址赋值给了全局变量指针,导致程序出现诡异的Segmentation fault,且是在MAC下,Linux下碰巧没遇到!。
排查问题:
当时发现全局变量*executor_globals.return_value_ptr_ptr
的值在经过某个函数调用的时候发生了改变(至于怎么发现这点的忘了= =)。
如下图,在经过efree(client->cli)
之后,*executor_globals.return_value_ptr_ptr
的值从0x000000010a244318
变为了0x000000010a244340
。
Read more...
初识火焰图
本文学习自:白话火焰图
火焰图的分类
压测程序时,火焰图能够帮助我们直观地了解到程序的性能瓶颈。本文主要是记录下在生成火焰图的时候的一些注意事项。以下链接是对每个类别的火焰图的详细说明。
- On-CPU:CPU Flame Graphs
- Off-CPU:Off-CPU Flame Graphs
- Memory:Memory Leak (and Growth) Flame Graphs
- Hot/Cold:Hot/Cold Flame Graphs
- Differential:Differential Flame Graphs
关于火焰图的PPT(讲解得非常详细):Blazing Performance with Flame Graphs
Read more...