小编dav*_*pfx的帖子

使用以前版本的编译器是否可以防止代码注入?

我想知道今天的现代编译器,如MS cc,gcc,clang,icc,更新的版本是否使用相同编译器的当前版本构建?

因为当然存在这种风险:
http://scienceblogs.com/goodmath/2007/04/15/strange-loops-dennis-ritchie-a/
http://c2.com/cgi/wiki?TheKenThompsonHack

我确信参与上述编译器开发的每个人都知道这个问题,代码由自身的早期版本注入编译器并无形地传播.

现在真正的问题,实际上并不是后门之一,但更多关于代码生成的正确性不是吗?如果构建链中某处某些变态扭曲是由纯错误引入的,那么今天的编译器会生成错误的代码,即使编译器的源代码看起来不错,因为Ken Thompson的缺陷?

因此,如果他们是自己建造的,他们如何保护自己?

c c++ compiler-construction compilation

29
推荐指数
2
解决办法
1014
查看次数

为什么typedef结构会产生链接失败

所以我有一段看起来像这样的代码.

typedef struct {
  int foo;
  int bar;
  void foobar(int, char*);
} mystruct;
Run Code Online (Sandbox Code Playgroud)

void mystruct::foobar(int x, char* y) { return; }
Run Code Online (Sandbox Code Playgroud)

mystruct obj;
obj.foobar(17, "X");
Run Code Online (Sandbox Code Playgroud)

这一切都完美地编译,链接和运行.除非它没有.在一个编译器上工作,在另一个编译器(Android GCC)上它失败并出现链接错误:不满意的引用.

如果我这样改变它,它会编译和链接.

struct mystruct {
  int foo;
  int bar;
  void foobar(int, char*);
};
Run Code Online (Sandbox Code Playgroud)

我想我知道为什么,但我无法正确解释它,我无法在标准中找到它.任何人都可以向我解释并找到适当的参考吗?

编辑:我认为所有人都很清楚这是C++代码.我标记了它; struct中的函数无效C; 但只是要清楚文件有CPP扩展名,编译器将其视为C++.

编辑:一个回答者注意到调用是一个文字,因此是const,但是arg是非const的.这不是一个关键因素,因为(a)编译器传递它(b)链接失败,无论参数类型如何.

编辑:我的理论是,这与传递给链接器的匿名结构类型有关,因此单独编译的声明和调用不匹配.看起来这可能不正确,在这种情况下,它可能只是一个微妙的编译器错误.

编辑:出于好奇,有人可以重现这种行为吗?实际的编译器是Android NDK,最近的下载,以及随之而来的任何GCC版本.如果其他编译器确实/没有这个问题,那可能就是答案.

c++ language-lawyer

16
推荐指数
1
解决办法
1114
查看次数

Django N + 1查询解决方案

在与同行讨论N + 1以及糟糕的数据库查询的严重性能影响后,我访问了http://guides.rubyonrails.org/active_record_querying.html.

ActiveRecord(Rails):

clients = Client.includes(:address).limit(10)
Run Code Online (Sandbox Code Playgroud)

在客户端具有地址的情况下,我打算在循环访问客户端时访问它们,Rails提供includes让它知道继续并将它们添加到查询中,这样可以立即消除9个查询.

Django的:

https://github.com/lilspikey/django-batch-select提供批量查询支持.你知道其他库或技巧来实现上面提供的Rails,但是在一个不那么冗长的庄园中(如在rails示例中只有19个字符修复N + 1并且非常清楚)?另外,批量选择是以同样的方式解决问题,还是这两个不同的事情?

顺便说一句,我不是在问select_related,虽然乍一看似乎是答案.我说的是address有一个forign键的情况client.

django django-orm select-n-plus-1

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

从相机面部检测iOS

我收到了一张图片视图

-(void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    NSString *mediaType = info[UIImagePickerControllerMediaType];

    [self dismissViewControllerAnimated:YES completion:nil];

    if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) {
        UIImage *image = info[UIImagePickerControllerOriginalImage];

        //imgvprofileImage.image = image;
        //[self detectForFacesInUIImage:[UIImage imageNamed:@"image00.jpg"]];

        [self detectForFacesInUIImage:image];
    }
    else if ([mediaType isEqualToString:(NSString *)kUTTypeMovie])
    {
        // Code here to support video if enabled
    }
}
Run Code Online (Sandbox Code Playgroud)

当我发这样的照片时

[self detectForFacesInUIImage:[UIImage imageNamed:@"image00.jpg"]]; 
Run Code Online (Sandbox Code Playgroud)

检测效果很好并找到一张脸但是当我使用从相机返回的图像时它不起作用.

 [self detectForFacesInUIImage:image]
Run Code Online (Sandbox Code Playgroud)

这是我用来检测脸部的功能

-(void)detectForFacesInUIImage:(UIImage *)facePicture
{
    CIImage* image = [CIImage imageWithCGImage:facePicture.CGImage];

    CIDetector* detector = [CIDetector detectorOfType:CIDetectorTypeFace context:nil options:[NSDictionary dictionaryWithObject:CIDetectorAccuracyLow forKey:CIDetectorAccuracy]];

    NSArray* features = [detector featuresInImage:image];

    if (features.count == …
Run Code Online (Sandbox Code Playgroud)

objective-c uiimage ios ios-camera

8
推荐指数
1
解决办法
4073
查看次数

指针到T,T数组和指向数组的T之间是否有未定义的行为?

请考虑以下代码.

#include <stdio.h>
int main() {
 typedef int T;
 T a[] = { 1, 2, 3, 4, 5, 6 };
 T(*pa1)[6] = (T(*)[6])a;
 T(*pa2)[3][2] = (T(*)[3][2])a;
 T(*pa3)[1][2][3] = (T(*)[1][2][3])a;
 T *p = a;
 T *p1 = *pa1;
 //T *p2 = *pa2; //error in c++
 //T *p3 = *pa3; //error in c++
 T *p2 = **pa2;
 T *p3 = ***pa3;
 printf("%p %p %p %p %p %p %p\n", a, pa1, pa2, pa3, p, p1, p2, p3);
 printf("%d %d %d %d %d %d …
Run Code Online (Sandbox Code Playgroud)

c c++ language-lawyer

6
推荐指数
1
解决办法
230
查看次数

哪种方法可以在乘法上测试有符号整数溢出?

如果以下任何一项符合标准的方式做"正确的事"?你可以假设m,并n有型int(有符号整数).主要问题是有符号整数溢出.

样品1.

size_t bytes = n * m;
if (n > 0 && m > 0 && SIZE_MAX/n >= m) {
    /* allocate “bytes” space */
}
Run Code Online (Sandbox Code Playgroud)

样本2.

if (n > 0 && m > 0 && SIZE_MAX/n >= m) {
    size_t bytes = n * m;
    /* allocate “bytes” space */
}
Run Code Online (Sandbox Code Playgroud)

样本3.

if (n > 0 && m > 0 && SIZE_MAX/n >= m) {
    size_t bytes = (size_t)n * (size_t)m;
    /* …
Run Code Online (Sandbox Code Playgroud)

c c++ language-lawyer

5
推荐指数
1
解决办法
900
查看次数

如何在匿名类型上实现Equals和GetHashCode?

帮助说:

匿名类型是直接从对象派生的类类型,不能转换为除object之外的任何类型.尽管您的应用程序无法访问它,但编译器为每个匿名类型提供了一个名称.从公共语言运行库的角度来看,匿名类型与任何其他引用类型没有区别.

如果程序集中的两个或多个匿名对象初始值设定项指定了具有相同顺序且具有相同名称和类型的属性序列,则编译器会将对象视为相同类型的实例.它们共享相同的编译器生成的类型信息.

因为匿名类型上的Equals和GetHashCode方法是根据属性的Equals和GetHashCode方法定义的,所以同一匿名类型的两个实例只有在它们的所有属性相等时才相等.

这些都是真的,但是怎么样?参考源明确显示了如何比较对象(ReferenceEquals)和"直接从对象派生"的类型不能具有此特殊行为.它不匹配的水煤浆EqualsValueType任.

那怎么办?匿名类型如何覆盖Equals()并且GetHashCode()没有任何可见的覆盖?

c# equals anonymous-types gethashcode

5
推荐指数
1
解决办法
1777
查看次数

LINQ可以构造并返回一个多维数组

是的,我确实知道锯齿状数组[] []和多维数组[,]之间的区别.

是的,我找了重复,发现了这些:

其中最后一个包含完成工作的功能.但我的问题仍然是:是否有任何方法(无论多么扭曲或设计)说服LINQ以多维数组(而不是锯齿状数组)的形式构造和返回结果?


这与问题并不真正相关,但是这里导致的问题之一是看起来像是"为LINQ制作"的小工作之一,除了我需要调用的函数已经用多维数组参数定义.作为锯齿状数组产生答案的LINQ代码花了大约5分钟来编写,然后是什么?我错过了什么,或者LINQ 真的没办法完成这项工作吗?


我想我应该说:除了编写一大块代码以旧的方式执行它并将其作为lambda嵌入或将其称为扩展方法.现在它看起来好像LINQ既不能生成也不消耗多维数组,我的问题的答案是否定的.

.net c# linq arrays multidimensional-array

4
推荐指数
1
解决办法
1218
查看次数

如何编写完全可移植的4字节字符常量的编译时初始化

(遗留)代码看起来大致如此.

#define MAKEID(a,b,c,d) (((UInt32)a)<<24 | ((UInt32)b)<<16 
                        | ((UInt32)c)<<8 | ((UInt32)d) )
#define ID_FORM MAKEID('F','O','R','M')
//...
struct S { 
  int id;
  int x;
  double d;
  // other stuff
};
//...
S s;
socket.read(&s, sizeof(s));  // read network data over struct
if (s.id == ID_FORM) { }
Run Code Online (Sandbox Code Playgroud)

代码将字符流读入结构中.已知S.id是4字符常量,例如流(网络)顺序中的'FORM'或'DATA',它确定结构其余部分的布局.使用预定义常量进行所有比较均为整数.

MAKEID宏是big-endian,因为它将第一个(字符)参数放在最高有效字节,这也是最低内存地址.宏的小端版本看起来像这样,将第一个(字符)参数放在最低有效字节,现在是最低内存地址.

 #define MAKEID(a,b,c,d) (((UInt32)d)<<24 | ((UInt32)c)<<16 
                        | ((UInt32)b)<<8 | ((UInt32)a) )
Run Code Online (Sandbox Code Playgroud)

问题是如何重写它以便它在big-endian和little-endian架构上同样有效.

不,我不想写两个宏并选择带#ifdef的宏.代码中的任何地方都没有其他的endian依赖,我不想在这里介绍一个.便携式是要走的路.

不,我不想写一个函数.此常量用于函数无法执行的位置.我编写了一个初始化union的可移植函数,代码无法编译.

任何类型的可移植宏或模板进行编译时初始化都是我正在寻找的.

在回答评论时,这是真正的代码.它是网络协议的一部分,另一端在大多数情况下负责字节序.这恰好是另一端以网络字节顺序生成的异常,并且这一端在历史上被写为big-endian,如4字节字符常量,如'FORM'.我需要一个点解决方案,而不是将端元主义的概念传播到代码中的其他地方.

c++ cross-platform

3
推荐指数
2
解决办法
507
查看次数

如何使键盘可滚动只读WPF TextBox?

这似乎是一件简单的事情:使用TextBox显示一些输出并允许用户从中剪切和粘贴,滚动但不编辑它.

但是:如果TextBox是只读的,那么它会失去大部分键盘行为.您可以单击它并使用不可见光标选择文本,但不会滚动或导航.

我有这个(可怕的)解决方案.

<TextBox Focusable="True"
     VerticalScrollBarVisibility="Auto"
     HorizontalScrollBarVisibility="Auto"
     FontFamily="Consolas" FontSize="10pt"
     Foreground="{Binding Path=OutputTextColour}" 
     Text="{Binding Path=OutputText}"
     Background="White" PreviewKeyDown="TextBox_PreviewKeyDown" />
Run Code Online (Sandbox Code Playgroud)

以及丢弃任何编辑尝试的处理程序:

   private void TextBox_PreviewKeyDown(object sender, KeyEventArgs e) {
  // the IsReadOnly flag on the control doesn't let the navigation keys work! WPF BUG?
  if (!(e.Key == Key.Down || e.Key == Key.Up || e.Key == Key.Left || e.Key == Key.Right 
     || e.Key == Key.Home || e.Key == Key.End || e.Key == Key.PageDown || e.Key == Key.PageUp 
     || e.Key == Key.Tab || e.Key == Key.Escape))
    e.Handled …
Run Code Online (Sandbox Code Playgroud)

c# wpf

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

为什么char [].Cast <int>会引发一个强制转换异常?

这是代码.这很简单.

  var text = "abcdef";
  var c1 = text.Cast<int>().ToArray(); // either this one
  var c2 = text.ToCharArray().Cast<int>().ToArray(); // or this one
Run Code Online (Sandbox Code Playgroud)

在任何一种情况下都会引发无效的强制转换异常.为什么?

对于奖励分数,如果不是这样的话,最简单的方法是做我显然要做的事情.


所以,代码我实际上要写这个:

  var c3 = text.Select(c=>(int)c).ToArray();
Run Code Online (Sandbox Code Playgroud)

哪个工作正常.

c# linq

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

向 Rails 模型添加动态属性

在 Rails 的早期版本中,可以向模型添加动态属性,而无需 SQL 列。以下代码在 4.0 之前有效。

drow = dtab1.drows.create()
drow.write_attribute('value1', 'xxx')
drow.write_attribute('value2', 'yyy')
drow.write_attribute('value3', 'zzz')
Run Code Online (Sandbox Code Playgroud)

但现在在 v5 中我得到:

ActiveModel::MissingAttributeError: can't write unknown attribute `value1`
Run Code Online (Sandbox Code Playgroud)

现在有什么办法可以做到吗?

其他答案提出了预定义的访问器或用“用户变量”哈希替换动态字段,但这不适用于我的情况。它们需要真正动态、在运行时创建并被视为模型的一部分。

attributes ruby-on-rails

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