标签: robustness

如何在禁用C++异常(VS2010)的情况下确保内存不足的可靠性?

我正在研究一个性能关键的动态链接库(DLL),它也应该具有相对较小的二进制大小.由于它没有显式抛出任何异常,我想完全禁用异常支持.但是,有一个例外(双关语无意):当内存不足(OOM)时,我必须向应用程序报告错误代码,以便它有机会正常处理事情.代码库太大,无法单独检查每个分配并传播错误,并包含我不应该触及的外部代码.所以我想在DLL的导出函数中捕获OOM异常.

快速测试表明,在Visual C++ 2010中禁用C++异常时(即没有/ EHa,/ EHsc或/ EHs标志),在分配太多内存时,它仍会跳转到catch(std :: bad_alloc&)块.

所以它似乎按预期工作.但是,我收到以下1级警告:"C4530:使用了C++异常处理程序,但未启用展开语义.指定/ EHsc".MSDN说"在帧中自动存储的对象,在执行throw的函数和捕获throw的函数之间,不会被破坏".

究竟我会在这里失去什么?只要通过库创建的任何内容都可以删除,并且应用程序可以重新开始(如果它选择的话),可以将事物保留在未定义状态.是否存在无法恢复的内存泄漏风险?

DLL是否使用单独的内存池?如果是这样,我可以清除它而不需要应用程序卸载DLL吗?我可以轻松地让我的库忽略任何进一步(导出)函数调用,直到应用程序执行重新初始化.

谢谢你的建议.

c++ dll exception out-of-memory robustness

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

从编译的可执行文件生成CLI shell脚本代码?

问题,讨论主题

我对编写命令行shell脚本源代码非常感兴趣,这些源代码是用更健壮,性能更好且独立于平台的编译语言(例如OCaml)编写的代码编写的.基本上,您可以使用编译语言编程来执行与您想要的操作系统的任何交互(我建议:更复杂的交互或以平台无关的方式不容易做到的交互),最后您将编译它到本机二进制可执行文件(最好),它会生成一个shell脚本,在shell中生成你在编译语言中编写的内容.[ 补充 ]:使用'效果',我的意思是设置环境变量和shell选项,执行某些非标准命令(标准脚本'glue'将由编译的可执行文件处理,并将保留在生成的shell脚本之外)等等.

到目前为止我还没有找到任何此类解决方案.与今天的其他可能性相比,实现它似乎相对容易*,比如将OCaml编译为JavaScript.

  • 是否已经(公开)实现了我所描述的内容?
  • 与我所描述的(非常)相似的其他可能性有哪些,以及它们与此有何不同?(脑到语编译(从编译到sh)会浮现在脑海中,虽然这似乎不必要地难以实现.)

不是故意的

  1. 另一种shell(如Scsh).您管理的系统可能并不总是允许用户或一个管理员选择shell,我也希望它是一个专门为其他人(客户,同事和其他人)提供的系统管理解决方案,也是不能指望的人接受不同的外壳.
  2. 另一种解释器,用于非交互式shell脚本通常用于的目的(如ocamlscript).就个人而言,我没有为此目的避免shell脚本的问题.我这样做是因为shell脚本通常难以维护(例如,对某些字符敏感并且操纵可变的东西,如'命令'),并且难以制作到与流行的通用编程语言可提供的功能相同的水平(对于例如,在这方面比较Bash和Python).但是,在某些情况下需要使用本机shell脚本,例如shell启动时由shell发送的shell配置文件.

背景

实际应用

你们中的一些人可能怀疑我所描述的实际用途.这样做的一个实际应用是根据各种条件定义一个shell配置文件(例如,配置文件来源的系统平台/操作系统,安全策略后面的内容,具体shell,登录/非登录类型shell,交互/非交互式shell).作为shell脚本的(精心设计的)通用shell配置文件的优势在于性能的提高(可能生成压缩/优化的源代码而不是人工编写的脚本解释的本机机器代码),健壮性(类型检查,异常处理) ,编译功能的时间验证,生成的二进制可执行文件的加密签名),功能(更少或不依赖于用户域CLI工具,不限制使用所有可能平台的CLI工具所涵盖的最低功能)和跨平台功能(在像单一UNIX规范这样的实践标准只是意味着很多,而且很多shell配置文件概念都会转移到非Windows平台,如同PowerShell一样.

实施细节,附带问题

  1. 程序员应该能够控制生成的shell脚本的通用程度.例如,可能是每次运行二进制可执行文件并输出适当的shell配置文件代码,或者它可以简单地生成针对一次运行的情况定制的固定shell脚本文件.在后一种情况下,列出的优势 - 特别是那些稳健性(例如异常处理和依赖用户工具)的优势更加有限.[添加]
  2. 生成的shell脚本是以某种形式的通用shell脚本(如GNU autoconf生成)还是shell(原生脚本)适应(动态或不适用于)特定shell对我来说不是主要问题.
  3. easy*:在我看来,这可以通过在库中为基本的shell内置函数提供基本可用的函数来实现.这样的函数只是将自身加上传递的参数转换为语义上合适且语法正确的shell脚本语句(作为字符串).

感谢您的进一步想法,特别是对于具体的建议!

shell scheme ocaml haskell robustness

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

Python,将整数写入'.txt'文件

使用pickle函数是将整数写入文本文件的最快且最强大的方法吗?

这是我到目前为止的语法:

import pickle

pickle.dump(obj, file)
Run Code Online (Sandbox Code Playgroud)

如果有更强大的替代方案,请随时告诉我.

我的用例是写一个用户输入:

n=int(input("Enter a number: "))
Run Code Online (Sandbox Code Playgroud)
  • 是的,人类将需要阅读它并可能编辑它
  • 文件中将有10个数字
  • Python可能需要稍后再读.

python performance pickle robustness

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

强大的haskell没有错误

我正在学习Haskell.我选择这种语言的动机之一是编写具有高度鲁棒性的软件,即完全定义的函数,数学上确定的函数,永不崩溃或产生错误.我并不是指由系统的谓词("系统内存不足","计算机着火"等)引起的故障,这些都不是很有趣,并且可能只是使整个过程崩溃.我也不是指由无效声明(pi = 4)引起的错误行为.

相反,我指的是错误状态导致的错误,我希望通过严格的静态类型使这些状态不可表示和不可编译(在某些函数中)来删除.在我看来,我把这些功能称为"纯粹",并认为强类型系统可以让我实现这一目标.但是,Haskell并没有以这种方式定义"纯",并允许程序error在任何上下文中崩溃.

为什么捕获异常非纯,但抛出异常是纯粹的?

这是完全可以接受的,并不奇怪.然而,令人失望的是,Haskell似乎没有提供某些功能来禁止可能导致分支使用的函数定义error.

这是一个人为的例子,为什么我觉得这令人失望:

module Main where
import Data.Maybe

data Fruit = Apple | Banana | Orange Int | Peach
    deriving(Show)

readFruit :: String -> Maybe Fruit
readFruit x =
    case x of
         "apple" -> Just Apple
         "banana" -> Just Banana
         "orange" -> Just (Orange 4)
         "peach" -> Just Peach
         _ -> Nothing

showFruit :: Fruit -> String
showFruit Apple = "An apple"
showFruit Banana = "A Banana"
showFruit (Orange x) …
Run Code Online (Sandbox Code Playgroud)

haskell robustness

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

检查函数参数的最佳方法:检查null或try/catch

在实现/使用返回或使用对象实例的方法时,检查函数参数的最优雅方法是什么?

致电方法:

someType GetSomething(object x)
{
    if (x == null) {
        return;
    }

    //
    // Code...
    //
}
Run Code Online (Sandbox Code Playgroud)

或更好:

someType GetSomething(object x)
{
    if (x == null) {
        throw new ArgumentNullException("x");
    }

    //
    // Code...
    //
}
Run Code Online (Sandbox Code Playgroud)

通话方式:

void SomeOtherMethod()
{
    someType myType = GetSomething(someObject);

    if (someType == null) {
        return;
    }

}
Run Code Online (Sandbox Code Playgroud)

或更好:

void SomeOtherMethod()
{
    try {
        someType myType = GetSomething(someObject);
    } catch (ArgumentNullException) {
    }
}
Run Code Online (Sandbox Code Playgroud)

浏览类似问题时,不使用try/catch的原因是性能.但恕我直言,尝试捕获只是看起来更好:).

那么,哪种方式更"优雅"?

c# methods exception-handling robustness

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

如何在存在异常的情况下稳健地调用第三方代码?

在使用异常信号错误的语言中,我想调用一些第三方代码,如果失败,则运行后备代码.例如:

try:
    result = third_party.fast_calculation()
catch:
    result = slower_calculation()
Run Code Online (Sandbox Code Playgroud)

根据我的经验,很少知道第三方代码可能抛出的所有异常.因此,我不能在catch条款中列出这些例外情况.另一方面,我经常被告知不要catch每一个可能的例外.

catch在这种情况下我该如何写条款?

language-agnostic exception-handling exception robustness

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

如何衡量稳健性?

我正在撰写关于测量产品质量的论文.本案例中的产品是一个网站.我已经确定了几个质量属性和测量技术.

一个质量属性是"健壮性".我想以某种方式向我保证,但我找不到任何有用的信息如何以客观的方式做到这一点.

是否存在可以确保稳健性的静态或动态指标?即,就像单元测试覆盖一样,有没有一种方法可以确保这样的稳健性?如果是这样,是否有任何(免费)工具可以做这样的事情?

有没有人有这种工具的经验?

最后但并非最不重要的是,也许还有其他方法可以确定稳健性,如果您有任何想法,我会全神贯注.

非常感谢提前.

java software-quality robustness

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

Erlang风格的Node.Js?

对于Node.Js和Erlang,我都是一个完整的菜鸟.但是不可能构建一个模拟Erlang行为的Node.js应用程序吗?

例如,您将json消息传递到分布式node.js服务器园区,甚至将新代码传递给那些没有脱机的服务器,就像erlang一样.

如果您有一个在收到消息时激活的消息处理程序回调,则此消息处理程序可以检查该消息是否是代码更新消息,从而用新代码替换自身(当前处理程序).

所以应该可以让Node.Js服务器没有停机时间来进行代码更新,而不是太大惊小怪,对吧?

erlang message-passing robustness node.js

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

我的脚本应该使用cp还是mv更健壮?

我有一个bash脚本(Scientific Linux).该脚本必须对文件进行操作.假设"file.dat"(大小约1 GB)一段时间后脚本重新启动并执行以下操作:

if [ -f file.dat ];  then
    cp file.dat file.previous.dat
fi
Run Code Online (Sandbox Code Playgroud)

备份文件.然后一个进程启动并覆盖"file.dat"

为了最安全的一面(电力关闭或任何意外).什么是最好的选择:cp还是mv?谢谢.

linux error-handling bash robustness fault

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

使用Ember.js开发的大型网站

我正在考虑使用Ember.js来开发我的新网站.

我不确定社区对大型项目的稳定性和使用程度.

  1. 你会推荐使用它吗?
  2. 你知道使用它的大型网站吗?

谢谢,Lior

client-side robustness ember.js

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