小编FSM*_*axB的帖子

如何通过GCC和Clang(或一般的LLVM)缓解幽灵

微软/Qspectre为他们的MSVC编译器添加了一个方便的功能(虽然这似乎只是(试图)缓解目前的Specter v1),他们将随着时间的推移进行更新.从用户的角度来看,这是非常好的,只需启用该标志,您就可以获得他们存储的最新和最大的缓解.

使用LLVM和GCC看起来有点不同.我认为他们的缓解措施尚未正式发布.

LLVM应该获得一个-mretpoline编译器标志,通过返回trampolines缓解Specter v2以进行间接调用.

另一方面,GCC有补丁,可以添加三个编译器选项来减轻Spectre v2:

  • -mindirect-branch可以设置为thunk.我理解它的方式,这为每个间接调用创建了retpolines.
  • -mfunction-return可以设置为thunk.我想这会将每个函数返回使用这些retpolines,这可能是Skylake所必需的,因为这些处理器也可以预测回报?
  • -mindirect-branch-register 这使用寄存器而不是堆栈来存储间接调用的地址?

所以我很困惑.什么编译器选项可以减轻用户空间应用程序所需的内容和方式?

一般打开它们是个好主意吗?如果针对甚至没有任何推测性执行的处理器架构(如微处理器)进行编译,它们是否也会生成这些retpolines?

Spectre v1怎么样?

更新:

让我问更准确的问题:

  • 我对编译器选项的正确理解是什么?
  • GCC选项是应用于任何地方还是仅适用于具有推测执行的处理器?
  • LLVM选项是应用于任何地方还是仅应用于具有推测执行的处理器?
  • 这些选项究竟是什么减轻了(他们是否完全减轻了幽灵v2)?
  • 让我们考虑其他一切我要求的额外"奖励"问题"这些问题很有用,但对我的问题不是必不可少的.

security gcc clang spectre

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

如何从ASP .NET Core MVC 1.0中的视图访问会话

我试图从视图内部访问会话数据.

使用案例:我将状态消息存储在将显示在页面顶部的会话中.目前我通过使用一个DisplayMessages()函数来实现它,该函数设置一些ViewData[....]属性并在每个控制器动作的开头调用它.

目标:我只想设置状态消息一次,而不需要控制器中的其他代码来显示下一页加载的消息.

所以我试图直接从视图中访问存储在会话中的消息.

到目前为止,我尝试了以下内容:

  • 依赖注入 IHttpContextAccessor(似乎不再适用于ASP .NET Core MVC 1.0.0
  • 创建一个静态类访问会话,包括从改变next()next.invoke()的意见建议
    • 这没用.我可以访问HttpContext并且Session.IsAvailable是真的,但会话中没有数据.

session asp.net-core-mvc asp.net-core asp.net-core-1.0

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

使专有的ELF二进制文件在Linux上可移植

我正在寻找一种方法来制作现有的专有ELF二进制文件,这些文件链接到特定版本的系统库,可移植.使用便携式,我的意思是使可执行程序在具有相同处理器体系结构和兼容系统内核的每个系统上工作,而不必具有库的源代码(如果没有源代码就没有办法,它也会很好) .

到目前为止,我想到了两种可能性,但我不知道它们是否完全可能,如果是,可以选择:

  1. 搜索所有链接库及其依赖项,并将它们包含在二进制文件的子目录中,并将Library-Path更改为该目录.
  2. 将库静态地重新链接到二进制文件中为一个大的可执行文件(如果程序没有根据校验和进行自我验证).

许可证没有问题,因为我不想分发创建的便携式程序,它仅供私人使用.

谢谢你的回答.

linux portability shared-libraries elf portable-applications

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

c ++ std :: ifstream:检查字符是否可以读取

有没有办法检查ifstream中是否有任何字符要读取,如果是,我该怎么做呢.如果您确定无法做到这一点,请告诉我.

编辑:我改变了我的问题更一般.

c++ stream ifstream

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

Swift 4.1 中对类绑定协议的弱引用的通用数组

我正在尝试创建一个WeakReference可以放入数组的泛型类型(并最终创建一个泛型弱数组类型)。

到目前为止一切顺利,但以下代码:

class WeakReference<ElementType: AnyObject> {
    weak var element: ElementType?

    init(_ element: ElementType) {
        self.element = element
    }
}

protocol Element: AnyObject {}

class WeakElementHolder {
    var weakElements: [WeakReference<Element>] = []
}
Run Code Online (Sandbox Code Playgroud)

产生这个编译器错误:

WeakReference.swift:12:21: error: 'WeakReference' requires that 'Element' be a class type
    var weakElements: [WeakReference<Element>] = []
                       ^
WeakReference.swift:1:7: note: requirement specified as 'ElementType' : 'AnyObject' [with ElementType = Element]
class WeakReference<ElementType: AnyObject> {
  ^
Run Code Online (Sandbox Code Playgroud)

这很奇怪,因为协议肯定需要一个类 ( AnyObject)。

奇怪的是,如果我省略泛型,一切正常:

protocol Element: AnyObject {}

class WeakElementReference { …
Run Code Online (Sandbox Code Playgroud)

arrays generics weak-references swift swift-protocols

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

无需过度使用linux上的Malloc

我如何在Linux上分配内存而不过度使用,以便NULL在没有可用内存且进程不会在访问时随机崩溃的情况下,malloc实际上返回?

我对malloc如何工作的理解:

  1. 分配器检查空闲列表是否有可用内存。如果是,则分配内存。
  2. 如果否,则从内核分配新页面。这就是过度使用可能发生的地方。然后返回新的内存。

因此,如果有一种方法可以从立即由物理内存支持的内核中获取内存,则分配器可以使用该内存而不是获取过量使用的页面,NULL如果内核拒绝提供更多的内存,则分配器可以返回。

有办法吗?

更新:

我知道这不能完全保护该过程免受OOM杀手的侵害,因为如果它的得分很差,它仍然会在内存不足的情况下被杀死,但这不是我担心的。

更新2: 名义动物的评论给了我以下使用的想法mlock

void *malloc_without_overcommit(size_t size) {
    void *pointer = malloc(size);
    if (pointer == NULL) {
        return NULL;
    }
    if (mlock(pointer, size) != 0) {
        free(pointer);
        return NULL;
    }

    return pointer;
}
Run Code Online (Sandbox Code Playgroud)

但这可能由于所有系统调用而非常慢,因此这可能应该在分配器实现的级别上完成。而且它还会阻止使用交换。

更新3:

根据约翰·博林格斯(John Bollingers)的评论提出了新想法:

  1. 检查是否有足够的内存。据我了解,这必须/proc/meminfoMemFreeSwapFree值中进行检查。
  2. 仅当有足够的可用空间(加上额外的安全裕度)时,才分配内存。
  3. 找出pagesize,getpagesize并在每个页面大小中向内存写入一个字节,以便它得到物理内存(RAM或交换)的支持。

我还仔细查看了mmap(2),发现了以下内容:

MAP_NORESERVE

不要为该映射保留交换空间。当保留交换空间时,可以保证可以修改映射。如果没有保留交换空间,则在没有物理内存可用的情况下,可能会在写入时获得SIGSEGV。另请参阅proc(5)中有关文件/ proc / sys / vm / overcommit_memory的讨论。在2.6之前的内核中,此标志仅对私有可写有效

这是否意味着进行映射~MAP_NORESERVE将完全保护该过程免受OOM杀手的侵害?如果是这样,这是一个完美的解决方案,只要有malloc实现,它就可以直接在之上工作mmap。(也许是jemalloc?)

更新4: …

c linux memory-management memory-overcommitment

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

如何确定C99中所需的最大对齐

是否有一种可移植的方式只依赖于C99标准提供的方法来找出任何数据类型所需的最大所需对齐.

就像maxalign_t在C++ 11中一样.

什么我目前做的是计算最小公倍数(lcm的比对)int,long int,long long int,double,void *size_t作为确定排列的尽力而为的方式.

更新: 我目前需要这个来实现一个包装器,malloc它在内存块的开头存储元数据,并返回一个地址高于malloc返回地址的指针.

c c99 memory-alignment

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

使用ASP .NET Core Identity和EntityFrameworkCore注册新用户时出现InvalidOperationException

我正在关注使用Identity文档并尝试注册一个新用户(执行注册操作),但它失败并出现以下错误:

InvalidOperationException:无法为"ApplicationUser"创建DbSet,因为此类型未包含在上下文的模型中.

启动:

services.AddIdentity<ApplicationUser, IdentityRole>(options =>
{
    //password options
    options.Password.RequireDigit = false;
    // ...
})
Run Code Online (Sandbox Code Playgroud)

我使用的是标准的ApplicationUser:

public class ApplicationUser : IdentityUser
{
}
Run Code Online (Sandbox Code Playgroud)

在AccountController中注册操作:

public async Task<IActionResult> Register(RegisterViewModel viewModel)
{
    if (ModelState.IsValid)
    {
        var user = new ApplicationUser { UserName = viewModel.UserName, Email = viewModel.Email };
        var result = await _userManager.CreateAsync(user, viewModel.Password); //<-- Exception happens here
        if (result.Succeeded)
        {
            await _signInManager.SignInAsync(user, isPersistent: false);
            _logger.LogInformation(3, "User created a new account with password.");
            return RedirectToAction(nameof(HomeController.Index), "Home");
        }

        string …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework asp.net-core-1.0 asp.net-core-identity

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

C89在预处理器时确定int的大小

我想根据整数的大小有条件地编译代码,但我没有找到一种方法来确定预处理器阶段中整数的大小.

一个想法是使用INT_MAX并将其与常量进行比较:

#if INT_MAX >= 9223372036854775807UL
    printf("64 bit\n");
#elif INT_MAX >= 2147483647UL
    printf("32 bit\n");
#else
    printf("16 bit\n");
#endif
Run Code Online (Sandbox Code Playgroud)

但我不认为UL文字可以那么大.而且ULL是不是在C89可用作据我所知.

那你对如何解决这个问题有什么建议吗?是否有一个宏在一些标准头文件中包含int的大小?

编辑:

不是这个问题的重复,因为我实际上不需要通用sizeof,我不想打印它.我只需要区分条件编译的不同整数大小.

c macros conditional-compilation c89 c-preprocessor

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

在Linux上记录RS232而无需等待换行

我试图将数据从RS232记录到带有cat的文件中:

cat /dev/ttyS0 > rs232.log
Run Code Online (Sandbox Code Playgroud)

结果是除了最后一行之外,我的文件中包含了所有内容.

通过打印到stdout,我能够发现,只有在获得换行符('\n')时,cat才会写入输出.我发现了同样的:

dd bs=1 if=/dev/ttyS0 of=rs232.log
Run Code Online (Sandbox Code Playgroud)

阅读后如何不等待Perl换行的情况下立即打印文本?我开始想,如果这可能是Linux-Kernel或coreutils包的缓冲问题.

根据TJD的评论,我用C编写了我自己的程序,但仍然遇到了同样的问题:

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* args[])
{
    char buffer;
    FILE* serial;
    serial = fopen(args[1],"r");
    while(1)
    {
        buffer = fgetc(serial);
        printf("%c",buffer);
    }
}
Run Code Online (Sandbox Code Playgroud)

截至我自己的C代码的结果,这似乎是一个Linux内核相关的问题.

linux logging serial-port

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