微软/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怎么样?
更新:
让我问更准确的问题:
我试图从视图内部访问会话数据.
使用案例:我将状态消息存储在将显示在页面顶部的会话中.目前我通过使用一个DisplayMessages()
函数来实现它,该函数设置一些ViewData[....]
属性并在每个控制器动作的开头调用它.
目标:我只想设置状态消息一次,而不需要控制器中的其他代码来显示下一页加载的消息.
所以我试图直接从视图中访问存储在会话中的消息.
到目前为止,我尝试了以下内容:
next()
到next.invoke()
的意见建议
HttpContext
并且Session.IsAvailable
是真的,但会话中没有数据.我正在寻找一种方法来制作现有的专有ELF二进制文件,这些文件链接到特定版本的系统库,可移植.使用便携式,我的意思是使可执行程序在具有相同处理器体系结构和兼容系统内核的每个系统上工作,而不必具有库的源代码(如果没有源代码就没有办法,它也会很好) .
到目前为止,我想到了两种可能性,但我不知道它们是否完全可能,如果是,可以选择:
许可证没有问题,因为我不想分发创建的便携式程序,它仅供私人使用.
谢谢你的回答.
linux portability shared-libraries elf portable-applications
有没有办法检查ifstream中是否有任何字符要读取,如果是,我该怎么做呢.如果您确定无法做到这一点,请告诉我.
编辑:我改变了我的问题更一般.
我正在尝试创建一个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) 我如何在Linux上分配内存而不过度使用,以便NULL
在没有可用内存且进程不会在访问时随机崩溃的情况下,malloc实际上返回?
我对malloc如何工作的理解:
因此,如果有一种方法可以从立即由物理内存支持的内核中获取内存,则分配器可以使用该内存而不是获取过量使用的页面,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)的评论提出了新想法:
/proc/meminfo
在MemFree
和SwapFree
值中进行检查。getpagesize
并在每个页面大小中向内存写入一个字节,以便它得到物理内存(RAM或交换)的支持。我还仔细查看了mmap(2),发现了以下内容:
MAP_NORESERVE
不要为该映射保留交换空间。当保留交换空间时,可以保证可以修改映射。如果没有保留交换空间,则在没有物理内存可用的情况下,可能会在写入时获得SIGSEGV。另请参阅proc(5)中有关文件/ proc / sys / vm / overcommit_memory的讨论。在2.6之前的内核中,此标志仅对私有可写有效
这是否意味着进行映射~MAP_NORESERVE
将完全保护该过程免受OOM杀手的侵害?如果是这样,这是一个完美的解决方案,只要有malloc
实现,它就可以直接在之上工作mmap
。(也许是jemalloc?)
更新4: …
是否有一种可移植的方式只依赖于C99标准提供的方法来找出任何数据类型所需的最大所需对齐.
就像maxalign_t
在C++ 11中一样.
什么我目前做的是计算最小公倍数(lcm
的比对)int
,long int
,long long int
,double
,void *
并size_t
作为确定排列的尽力而为的方式.
更新:
我目前需要这个来实现一个包装器,malloc
它在内存块的开头存储元数据,并返回一个地址高于malloc
返回地址的指针.
我正在关注使用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) 我想根据整数的大小有条件地编译代码,但我没有找到一种方法来确定预处理器阶段中整数的大小.
一个想法是使用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,我不想打印它.我只需要区分条件编译的不同整数大小.
我试图将数据从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内核相关的问题.