小编Mac*_*ade的帖子

PHP在foreach中通过引用传递

我有这个代码:

$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认证学习指南.

php

177
推荐指数
7
解决办法
10万
查看次数

Win32 - 从C代码回溯

我目前正在寻找一种在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)

c windows backtrace

43
推荐指数
1
解决办法
3万
查看次数

x86-64汇编的性能优化 - 对齐和分支预测

我目前编码的一些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)

performance assembly x86-64 sse2 branch-prediction

27
推荐指数
3
解决办法
5817
查看次数

GCC:严格别名警告的准确性

我正在尝试检查我的一些代码是否存在严格的别名违规,但在尝试理解严格的别名规则时,我似乎错过了一些东西.

想象一下以下代码:

#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)

c gcc c99 strict-aliasing

20
推荐指数
2
解决办法
4260
查看次数

@param在课堂上意味着什么?

@param在创建课程时意味着什么?据我所知,它用于告诉脚本变量是什么类型的数据类型以及函数返回的值类型,是吗?例如:

/**
 * @param string $some
 * @param array $some2
 * @return void
 */
Run Code Online (Sandbox Code Playgroud)

是不是有另一种方法可以做到这一点,我想的是:void function() { ... }或类似的东西.对于变量,可能(int)$ test;

php class param

19
推荐指数
1
解决办法
3万
查看次数

是否有一种简单的方法(在Cocoa/iOS中)将方法调用排队以在下一个运行循环中运行一次?

UIView有一个setNeedsDisplay方法,可以在同一个事件循环中多次调用,安全知道重绘工作很快就会发生,而且只有一次.

Cocoa有这种行为的通用机制吗?一种说法,"按照你喜欢的方式多次排队一个选择器,当它的时候,选择器将运行一次并清除队列."

我知道我可以通过目标中的某种状态跟踪或使用NSOperationQueue来执行此操作.我只是想知道是否有一种我错过的轻量级方法.

(当然,答案可能是"不".)

cocoa cocoa-touch objective-c ios

13
推荐指数
2
解决办法
1688
查看次数

Xcode 4 Strip存档时所有符号错误

我的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更改此设置,所以我想知道如何解决这个问题?

谢谢

iphone xcode4

12
推荐指数
1
解决办法
2870
查看次数

利用缓冲区溢出

为了我的学习,我尝试创建一个有效载荷,使其溢出缓冲区并调用一个名为"目标"的"秘密"函数

这是我用于在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)

c x86 buffer-overflow

12
推荐指数
1
解决办法
1282
查看次数

使用LINQ to SQL忽略SQL Server中的重音

如何使用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)

linq sql-server linq-to-sql

10
推荐指数
1
解决办法
1万
查看次数

为NSDate添加天数

我想要添加几天的日期,我有很多代码,但是没有一个代码在我看来下面显示的是我的代码,请有人帮我解决这个问题

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)

iphone objective-c nsdate ios

10
推荐指数
2
解决办法
2万
查看次数