DependableSystemsLab / LLFI

LLFI is an LLVM based fault injection tool, that injects faults into the LLVM IR of the application source code. The faults can be injected into specific program points, and the effect can be easily tracked back to the source code. Please refer to the paper below. NOTE: If you publish a paper using LLFI, please add it to PaperLLFI.bib
http://blogs.ubc.ca/karthik/2014/02/23/quantifying-the-accuracy-of-high-level-fault-injection-techniques/
Other
68 stars 35 forks source link

Random Hardware Fault #65

Closed jhausladen closed 9 years ago

jhausladen commented 9 years ago

When trying to instrument e.g., the factorial.c example with the "random" input.yaml file the program raises an exception on the commandline and nothing is selected.

Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1770) at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1653) at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86) at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49) at javafx.event.Event.fireEvent(Event.java:198) at javafx.scene.Node.fireEvent(Node.java:8390) at javafx.scene.control.Button.fire(Button.java:185) at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182) at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96) at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89) at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218) at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80) at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54) at javafx.event.Event.fireEvent(Event.java:198) at javafx.scene.Scene$MouseHandler.process(Scene.java:3758) at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3486) at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762) at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2495) at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:350) at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:275) at java.security.AccessController.doPrivileged(Native Method) at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$350(GlassViewEventHandler.java:385) at com.sun.javafx.tk.quantum.GlassViewEventHandler$$Lambda$347/1299860005.get(Unknown Source) at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:404) at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:384) at com.sun.glass.ui.View.handleMouseEvent(View.java:555) at com.sun.glass.ui.View.notifyMouse(View.java:927) at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method) at com.sun.glass.ui.gtk.GtkApplication.lambda$null$48(GtkApplication.java:139) at com.sun.glass.ui.gtk.GtkApplication$$Lambda$41/1766822961.run(Unknown Source) at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71) at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275) at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1765) ... 50 more Caused by: java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer at application.InputYaml.load(InputYaml.java:109) at application.InstrumentController.loadProfile(InstrumentController.java:539) at application.InstrumentController.onClickSelectProfile(InstrumentController.java:533) ... 60 more

karfair commented 9 years ago

I will look into this. Which file did you use as the "random" input.yaml file?

jhausladen commented 9 years ago

I used the input.yaml file located in "test_suite/HardwareFaults/random" on the factorial.c example

karfair commented 9 years ago

I've fixed the issue in the newest update of LLFI. However, the input.yaml file you selected isn't valid for factorial.c. Please use this yaml instead or build your own using the instructions provided here or here. Thanks!

jhausladen commented 9 years ago

Thanks, great job. I will look into it.

karthikp-ubc commented 9 years ago

Thanks Phil for fixing this. Can you please update the yaml file in the factorial directory of the LLFI distribution ? If it works, we can go ahead and close the issue.

jhausladen commented 9 years ago

@karfair Could you explain a bit more , why the input.yaml file I used from the test_suite/HardwareFaults/random is not valid for the factorial.c example.

Fyi, we are testing tools for hardware fault injection e.g. radiation faults, with all kind of C code, for testing future implementations in the field of control-flow checking. So we would like to use a tool like yours to inject hardware faults and test the behaviour of our CFC-algorithm.

karfair commented 9 years ago

@karthikp-ubc I have updated the .yaml file. @jhausladen I did not write the "random" input.yaml file, but from what I understand (someone correct me if I am wrong) the file is only for the automated testing suite, and it is designed to be broken. From the file, "fi_cycle: 2661577811". This targets the 2661577811th execution of a certain instruction, for factorial.c, the entire execution is probably less than a 1000 cycles. I hope this helps!

jhausladen commented 9 years ago

@karfair Which .yaml file did you update? In my opinion the .yaml files provided in the test suite are valid input files for the corruption of the different samples such as factorial, deadlock etc. It would not make sense to corrupt yaml files because they are just a configuration file for LLFI including number of runs etc. Also not every program in the test suite folder includes a dedicated .yaml file

Can someone point me in the right direction for simulating the effects of hardware faults in a program for testing Control-Flow verification algorithms.

karthikp-ubc commented 9 years ago

You're correct that all the yaml files should be valid ones, and not contain wrong parameters. We'll look into this issue and fix it (I believe that @karfair may have already done so for the other yaml files).

As for the control-flow verification algorithms, I think this is best addressed in the llfi-development list. Please join the list if you haven't done so and explain in detail what you're trying to do. Thanks a lot.

jhausladen commented 9 years ago

@karthikp-ubc I have sent a request to join the llfi-development list but got a notification from Google that it either may not exist or I may not have the permission to post messages to the group. How do I actually subscribe to the list? The address I used was llfi-development@googlegroups.com

chipbuster commented 9 years ago

@jhausladen The address I used was llfi-development+subscribe@googlegroups.com. Did it just last week, so hopefully it still works.

karfair commented 9 years ago

@jhausladen I added new .yaml files to the repository as some programs were missing them. I believe the .yaml in the random folder was intentionally erroneous to test if LLFI itself is working correctly (and not letting the scripts run with bad settings).