Giter VIP home page Giter VIP logo

cossacklabs / themis Goto Github PK

View Code? Open in Web Editor NEW
1.8K 1.8K 142.0 48.86 MB

Easy to use cryptographic framework for data protection: secure messaging with forward secrecy and secure data storage. Has unified APIs across 14 platforms.

Home Page: https://www.cossacklabs.com/themis

License: Apache License 2.0

Makefile 2.32% C 44.44% C++ 8.72% Objective-C 4.96% Java 5.86% Python 2.76% Ruby 2.64% Shell 0.68% PHP 4.78% Go 4.25% JavaScript 3.60% M4 0.07% Swift 1.23% CMake 0.09% Rust 9.74% NSIS 0.03% SmPL 0.04% Kotlin 1.18% TypeScript 2.61%
asymmetric-cryptography authentication cryptography cryptography-library encryption golang ios java javascript objective-c owasp php python ruby rust secure-messenger secure-storage security swift symmetric-cryptography

themis's People

Contributors

concatime avatar dependabot[bot] avatar djaffer avatar forelocked-beobachter avatar g1gg1l3s avatar gene-eu avatar gitter-badger avatar iamnotacake avatar ignatk avatar ilammy avatar julepka avatar karenswry avatar lagovas avatar mansourmoufid avatar maxammann avatar mnaza avatar mozhmike avatar mrtnrst avatar newfrankway avatar radetsky avatar shadinua avatar storojs72 avatar valeriyvan avatar vixentael avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

themis's Issues

Make exceptions and errors consistent on all platforms

Aim: make user experience in reading exceptions and errors useful, not frustrating
How to: take 'themis_secure_cell_decrypt_seal error' and transform it to 'Secure Cell failed decrypting, seal is invalid", for example

Compiling Themis iOS lib causes billions of warnings

Themis and Soter core (not iOS wrapper!) are causing many warnings when are compiled by Xcode.

screen shot 2015-09-30 at 03 06 59

You can build this project using Xcode7 with default settings, pointing on x64 device or simulator to see warnings.

In iOS world having even one warning with default Xcode warning flags is a bad practice.

@mnaza please, take a look

Does not work with Go 1.6

When executing go test:
panic: runtime error: cgo argument has Go pointer to Go pointer

It seems Go 1.6 has stricter rules for passing Go pointers to C code:
golang/go#12416

Insufficient checks in secure_comparator.c

As far as I can tell, there are too few checks in secure_comparator.c.

Unless I have misunderstood some assumption about ed25519, then if either Alice or Bob chose rand == rand2 == rand3 == 0, then they would always be authenticated correctly. (I know that generate_random_32 won't choose these values, but an attacker easily could).

According to wikipedia, there is also a possible attack by choosen P or Q based on they other persons P and Q. I do not think the implementation is vulnerable to this based on the order in which you exchange the messages, but I am not completely certain.

Release 0.9.2

Releasing 0.9.2

  • provide iOS SecureSession docs
  • merge latest docs to main repo
  • push tag 0.9.2
  • add nice release notes
  • bump podspec version to 0.9.2, point to latest tag; push podspec to CocoaPods repo

Seek better docs hosting

By receiving a few bits of feedback sounding almost equally (github's wiki is not well suited to read our style of documentation), before proceeding with even betters docs and tutorials, which are on their way, I'd like to hear your opinions, which documentation hosting platforms / documentation generation systems could work for us.

We could of course write our own tiny website-like thing, suited for our documentation needs, but I doubt this effort is worth it right now.

Warnings during compilation gothemis

src/github.com/cossacklabs/themis/gothemis/session/session.c: In function ‘on_get_public_key_for_id’:
src/github.com/cossacklabs/themis/gothemis/session/session.c:10:9: warning: implicit declaration of function ‘onPublicKeyForId’ [-Wimplicit-function-declaration]
  return onPublicKeyForId(user_data, id, id_len, key, key_len);
         ^
src/github.com/cossacklabs/themis/gothemis/session/session.c: In function ‘on_state_changed’:
src/github.com/cossacklabs/themis/gothemis/session/session.c:15:2: warning: implicit declaration of function ‘onStateChanged’ [-Wimplicit-function-declaration]
  onStateChanged(user_data, event);
  ^

Do not use 'themis' name in cocoapod subspec

Currently themis.podspec contains subspec named "themis".

It leads to multiple search results, when user is looking for themis in CocoaPods repo:
screen shot 2015-06-02 at 17 53 00

Historically, such naming had sense while we were solving the problem with the folder structure.

But now I suggest renaming subspecs to core and objcwrapper, if it won't break folder structure:

    s.subspec 'core' do |ss|
       ...
    end    
    s.subspec 'objcwrapper' do |ss|
       ...
    end

Swift 3 wrapper

I want to migrate Swift wrapper to use Swift3.

Usually, iOS libraries support both Swift 2.3 and Swift 3 as separate branches or versions (f.e. you can use version 9.3 with Swift2.3 or version 9.4 with Swift 3 support).

What is the most preferable decision for us? Just drop Swift2.3 support and migrate to Swift3?

PHP Wrapper for Secure Message (Signed Message Variant)

Code of the form:

$ka = phpthemis_gen_ec_key_pair();
$kb = phpthemis_gen_ec_key_pair();
$em = phpthemis_secure_message_wrap($ka['private_key'],$kb['public_key'],"My message");

works as expected producing an encrypted message. However, from themis_secure_message_wrap(...) in secure_message.c one would expect that passing NULL (or possibly a zero length string) for the public_key parameter would generate the "signed but not encrypted" version of the message.

But both:

$em = phpthemis_secure_message_wrap($ka['private_key'],NULL,"My message");
$em = phpthemis_secure_message_wrap($ka['private_key'],'',"My message");

result in and empty string (gettype($em) == 'string') being returned. I suspect (via zend_parse_parameters ?) the public_key explicitly or implicitly ends up as an empty string (rather than NULL) so the clause in secure_message.c that would trigger "signing" rather than "encrypting" i.e. if(public_key==NULL && public_key_length==0) cannot happen.

Secure Cell / Optional Context / Clarification

Expressed in phpthemis terms we have:

string phpthemis_scell_full_encrypt(string $password, string $message [, string $context])
array  phpthemis_scell_auto_encrypt(string $password, string $message [, string $context])
string phpthemis_scell_user_encrypt(string $password, string $message, string $context)

string phpthemis_scell_full_decrypt(string $password, string $encrypted_message [, string $context])
string phpthemis_scell_auto_decrypt(string $password, $encrypted_message string $additional_auth_data [, string $context])
string phpthemis_scell_user_decrypt(string $password, string $encrypted_message, string $context)

$context is optional for the "full" and "auto" variants but mandatory for the "user" variant. Documentation should make this variation (and the reasoning behind it) clear.

ThemisPP

  • organize 3 examples (SSession / SMessage / SCell)
  • document building for Linux and for PNaCl
  • tests
  • commit to main rep
  • example project will be Secure WebChat we're doing

Enhance documentation

High-level objects are crippled by 'examplistic' approach to describing their functions. This works for some, but not for all. Every high-level language function should have a more formal description like this, to make people who are less interested in long experimentation sessions to only understand the function's syntax:

(example taken based on problems with PHP docs):
string phpthemis_scell_full_encrypt(string $password, string $message [,string $context]);
Description: Encrypts $message using $password and an optional $context.
Returns the encrypted message or an empty string on failure.

or

array phpthemis_scell_auto_split_encrypt(string $password, string $message [,string $context]);
Description: Encrypts $message using $password and an optional $context. On success, returns an associative array containing string elements ‘encrypted_message’ and ‘additional_auth_data’. On failure an empty string is returned.

Python wrapper library paths

PyThemis installs Python wrappers which refer to .so library:

from themis import smessage, scell
File "/Users/aint/themis-server/DEMO/themis/smessage.py", line 3, in <module>
themis = cdll.LoadLibrary('libthemis.o')
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py", line 443, in LoadLibrary
return self._dlltype(name)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py", line 365, in __init__
self._handle = _dlopen(self._name, mode)
OSError: dlopen(libthemis.o, 6): image not found

Also, for some odd reason, it requires additional variables:

set DYLD_FALLBACK_LIBRARY_PATH=/usr/lib/

to actually find Themis.

Segmentation fault in python3.4

Python 3.4.3 (default, Oct 12 2015, 13:56:10) 
[GCC 5.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from pythemis.scomparator import scomparator
>>> scomparator(b'asd')
Segmentation fault (core dumped)

In python3.5 code is working

Update the docs about cryptographic choices

... to more correctly reflect current crypto algorithms in charge for all current crypto primitives. It could be simply done by interpreting corresponding defines, e.g.

#define THEMIS_SYM_KEY_LENGTH SOTER_SYM_256_KEY_LENGTH
#define THEMIS_AUTH_SYM_ALG (SOTER_SYM_AES_GCM|THEMIS_SYM_KEY_LENGTH)

in sym_enc_message.c.

RubyThemis

We need to study current state of Ruby and understand what, apart from EventMachine, which is deprected, to use to build examples for smessage / ssession.

Add ThemisPP examples

We've added C++ Themis and it's documentation, but forgot the examples! @mnaza be so kind not to forget to have examples by 0.9.3

Python wrapper dependency problem

When installing PyThemis on Mac OS X, it requires package Enum to run, and doens't install it automatically. On clean system there is no Enum package out of the box.

Podspec CocoaPods 1.0 compatibility

The given:

Creating a new iOS project, linking themis master as CocoaPod.

The problem:

If you create new project using CocoaPods v1.0.1, your podfile includes use_frameworks! and links to the HEAD of master branch, then Pods can't be installed.

podfile:

source 'https://github.com/CocoaPods/Specs.git'

platform :ios, '9.0'
project 'NoWorkingPodsDemo/NoWorkingPodsDemo.xcodeproj'
inhibit_all_warnings!
use_frameworks!

install! 'cocoapods', :deterministic_uuids => false

target :"NoWorkingPodsDemo" do

   # example should work with head
  pod 'themis', :git => "https://github.com/cossacklabs/themis.git"

end

Error log

Analyzing dependencies
Pre-downloading: `themis` from `https://github.com/cossacklabs/themis.git`
^[[A^[[A[!] Unable to find a specification for 'themis'.

[!] Unable to load a podspec from `themis.podspec`, skipping:

Pod::DSLError

Packaged Distribution

Time has come to talk about binary distribution of Themis. The aim is to simplify build process to a point where user issues commands to 2 package managers: one for system package (themis itself), second for wrapper.

This is about experience, and even though we don't need it for our stuff, it's been privately asked for, a few times.

Obviously, we'll do .deb for Debian/Ubuntu. Any other ideas what/where we could go with this?

Compilation error of SwiftThemisServerExample

Project can't be compiled and build because of compilation error in Themis itself:
./themis/docs/examples/Themis-server/swift/Pods/themis/src/soter/boringssl/soter_asym_cipher.c:146:8: Implicit declaration of function 'EVP_PKEY_get0_RSA' is invalid in C99

xcode 7.3.1

xcode 8 can't compile either because of old swift version of the project.

Secure comparator is broken

The attack is send g2a or g2b as the zero point "(0, 2^255-19+1)"

unsigned char zero[32] = {0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                          0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                          0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                          0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f};

These won't match this zero point:

if (!memcmp(input, ec_g_comp, ED25519_GE_LENGTH) || !memcmp(((const unsigned char *)input) + ED25519_GE_LENGTH, ec_g_comp, ED25519_GE_LENGTH))
and
if (!memcmp(input, ec_g_comp, ED25519_GE_LENGTH) || !memcmp(((const unsigned char *)input) + ED25519_GE_LENGTH, ec_g_comp, ED25519_GE_LENGTH))

New docs engine

Based on feedback from some of our users and (even) developers, we will try to build stand-alone documentation hosting.

We need opinions on:

  1. Should the docs be replicated to github wiki? If convenient documentation solution is chosen and implemented, should we even care about github wiki?
  2. What features would our users like to see on documentation site, apart from being able to read documentation in convenient fashion, obviously :)

Motivation:

  • @Lagovas has put a lot of effort into producing awesome tutorials, which do not fit neither our blog nor github structure.
  • upon release of forthcoming products, keeping all documentation in one place might simplify cross-product usage - for example, acra users, who will want custom functionality from acra writer modules, will still need access to themis documentation, and if it's worth a few clicks instead of going to different site, it is going to save a lot of time, nerve and context switching

JSThemis

Well, time has come to spend a few days writing wrappers for NodeJS / JavaScript.

0.9.3 Documentation

since we now have a dedicated technical writer, let's slowly accumulate examples and ideas for further enhancing Themis documentation for better understandability in comments.

jsthemis build error with nodejs 6.3.0

[lagovas@localhost js]$ npm install jsthemis

> [email protected] preinstall /home/lagovas/development/tutorials/js/node_modules/.staging/jsthemis-072db551
> node-gyp configure && node-gyp build

make: Entering directory '/home/lagovas/development/tutorials/js/node_modules/.staging/jsthemis-072db551/build'
  CXX(target) Release/obj.target/jsthemis/addon.o
In file included from ../addon.cpp:18:0:
../secure_message.hpp:25:49: error: expected class-name before ‘{’ token
   class SecureMessage : public node::ObjectWrap {
                                                 ^
../secure_message.hpp:33:48: error: ‘Arguments’ in namespace ‘v8’ does not name a type
     static v8::Handle<v8::Value> New(const v8::Arguments& args);
                                                ^~~~~~~~~
../secure_message.hpp:34:52: error: ‘Arguments’ in namespace ‘v8’ does not name a type
     static v8::Handle<v8::Value> encrypt(const v8::Arguments& args);
                                                    ^~~~~~~~~
../secure_message.hpp:35:52: error: ‘Arguments’ in namespace ‘v8’ does not name a type
     static v8::Handle<v8::Value> decrypt(const v8::Arguments& args);
                                                    ^~~~~~~~~
../secure_message.hpp:36:49: error: ‘Arguments’ in namespace ‘v8’ does not name a type
     static v8::Handle<v8::Value> sign(const v8::Arguments& args);
                                                 ^~~~~~~~~
../secure_message.hpp:37:51: error: ‘Arguments’ in namespace ‘v8’ does not name a type
     static v8::Handle<v8::Value> verify(const v8::Arguments& args);
                                                   ^~~~~~~~~
In file included from ../addon.cpp:19:0:
../secure_keygen.hpp:25:43: error: expected class-name before ‘{’ token
   class KeyPair : public node::ObjectWrap {
                                           ^
../secure_keygen.hpp:34:48: error: ‘Arguments’ in namespace ‘v8’ does not name a type
     static v8::Handle<v8::Value> New(const v8::Arguments& args);
                                                ^~~~~~~~~
../secure_keygen.hpp:35:56: error: ‘Arguments’ in namespace ‘v8’ does not name a type
     static v8::Handle<v8::Value> private_key(const v8::Arguments& args);
                                                        ^~~~~~~~~
../secure_keygen.hpp:36:55: error: ‘Arguments’ in namespace ‘v8’ does not name a type
     static v8::Handle<v8::Value> public_key(const v8::Arguments& args);
                                                       ^~~~~~~~~
In file included from ../addon.cpp:20:0:
../secure_session.hpp:26:49: error: expected class-name before ‘{’ token
   class SecureSession : public node::ObjectWrap {
                                                 ^
In file included from ../addon.cpp:20:0:
../secure_session.hpp:34:48: error: ‘Arguments’ in namespace ‘v8’ does not name a type
     static v8::Handle<v8::Value> New(const v8::Arguments& args);
                                                ^~~~~~~~~
../secure_session.hpp:35:59: error: ‘Arguments’ in namespace ‘v8’ does not name a type
     static v8::Handle<v8::Value> connectRequest(const v8::Arguments& args);
                                                           ^~~~~~~~~
../secure_session.hpp:36:49: error: ‘Arguments’ in namespace ‘v8’ does not name a type
     static v8::Handle<v8::Value> wrap(const v8::Arguments& args);
                                                 ^~~~~~~~~
../secure_session.hpp:37:51: error: ‘Arguments’ in namespace ‘v8’ does not name a type
     static v8::Handle<v8::Value> unwrap(const v8::Arguments& args);
                                                   ^~~~~~~~~
../secure_session.hpp:38:58: error: ‘Arguments’ in namespace ‘v8’ does not name a type
     static v8::Handle<v8::Value> isEstablished(const v8::Arguments& args);
                                                          ^~~~~~~~~
In file included from ../addon.cpp:21:0:
../secure_cell_seal.hpp:25:50: error: expected class-name before ‘{’ token
   class SecureCellSeal : public node::ObjectWrap {
                                                  ^
../secure_cell_seal.hpp:33:48: error: ‘Arguments’ in namespace ‘v8’ does not name a type
     static v8::Handle<v8::Value> New(const v8::Arguments& args);
                                                ^~~~~~~~~
../secure_cell_seal.hpp:34:52: error: ‘Arguments’ in namespace ‘v8’ does not name a type
     static v8::Handle<v8::Value> encrypt(const v8::Arguments& args);
                                                    ^~~~~~~~~
../secure_cell_seal.hpp:35:52: error: ‘Arguments’ in namespace ‘v8’ does not name a type
     static v8::Handle<v8::Value> decrypt(const v8::Arguments& args);
                                                    ^~~~~~~~~
In file included from ../addon.cpp:22:0:
../secure_cell_context_imprint.hpp:25:60: error: expected class-name before ‘{’ token
   class SecureCellContextImprint : public node::ObjectWrap {
                                                            ^
../secure_cell_context_imprint.hpp:33:48: error: ‘Arguments’ in namespace ‘v8’ does not name a type
     static v8::Handle<v8::Value> New(const v8::Arguments& args);
                                                ^~~~~~~~~
../secure_cell_context_imprint.hpp:34:52: error: ‘Arguments’ in namespace ‘v8’ does not name a type
     static v8::Handle<v8::Value> encrypt(const v8::Arguments& args);
                                                    ^~~~~~~~~
../secure_cell_context_imprint.hpp:35:52: error: ‘Arguments’ in namespace ‘v8’ does not name a type
     static v8::Handle<v8::Value> decrypt(const v8::Arguments& args);
                                                    ^~~~~~~~~
In file included from ../addon.cpp:23:0:
../secure_cell_token_protect.hpp:25:58: error: expected class-name before ‘{’ token
   class SecureCellTokenProtect : public node::ObjectWrap {
                                                          ^
../secure_cell_token_protect.hpp:33:48: error: ‘Arguments’ in namespace ‘v8’ does not name a type
     static v8::Handle<v8::Value> New(const v8::Arguments& args);
                                                ^~~~~~~~~
../secure_cell_token_protect.hpp:34:52: error: ‘Arguments’ in namespace ‘v8’ does not name a type
     static v8::Handle<v8::Value> encrypt(const v8::Arguments& args);
                                                    ^~~~~~~~~
../secure_cell_token_protect.hpp:35:52: error: ‘Arguments’ in namespace ‘v8’ does not name a type
     static v8::Handle<v8::Value> decrypt(const v8::Arguments& args);
                                                    ^~~~~~~~~
make: *** [jsthemis.target.mk:98: Release/obj.target/jsthemis/addon.o] Error 1
make: Leaving directory '/home/lagovas/development/tutorials/js/node_modules/.staging/jsthemis-072db551/build'
gyp ERR! build error 
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack     at ChildProcess.onExit (/usr/lib/node_modules/npm/node_modules/node-gyp/lib/build.js:276:23)
gyp ERR! stack     at emitTwo (events.js:106:13)
gyp ERR! stack     at ChildProcess.emit (events.js:191:7)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:204:12)
gyp ERR! System Linux 4.6.4-1-ARCH
gyp ERR! command "/usr/bin/node" "/usr/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "build"
gyp ERR! cwd /home/lagovas/development/tutorials/js/node_modules/.staging/jsthemis-072db551
gyp ERR! node -v v6.3.0
gyp ERR! node-gyp -v v3.4.0
gyp ERR! not ok 
npm ERR! Linux 4.6.4-1-ARCH
npm ERR! argv "/usr/bin/node" "/usr/bin/npm" "install" "jsthemis"
npm ERR! node v6.3.0
npm ERR! npm  v3.10.5
npm ERR! code ELIFECYCLE

npm ERR! [email protected] preinstall: `node-gyp configure && node-gyp build`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the [email protected] preinstall script 'node-gyp configure && node-gyp build'.
npm ERR! Make sure you have the latest version of node.js and npm installed.
npm ERR! If you do, this is most likely a problem with the jsthemis package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     node-gyp configure && node-gyp build
npm ERR! You can get information on how to open an issue for this project with:
npm ERR!     npm bugs jsthemis
npm ERR! Or if that isn't available, you can get their info via:
npm ERR!     npm owner ls jsthemis
npm ERR! There is likely additional logging output above.

npm ERR! Please include the following file with any support request:
npm ERR!     /home/lagovas/development/tutorials/js/npm-debug.log
[lagovas@localhost js]$ node -v
v6.3.0

Transparent hood

Object returning a string with current cryptographic algorithm choices for current object.

Build error objc project with Themis 0.9.1 and xcode 7.1

ThemisTest (objc main example) stops building on Xcode 7.1 due to imperfection of our PodSpec.

0.9.1 podspec has several error.h files at the same subfolder and it confuses xcode and leads to build error.
screen shot 2015-11-02 at 02 22 32

Build errors:
screen shot 2015-11-02 at 02 13 08

Latest podspec is based on subspecs and doesn't cause build error.

Users that install Themis directly like pod 'themis', :git => "https://github.com/cossacklabs/themis.git" are not affected.

Anyway, we really need to update podspec ASAP. We can simply bump version to 0.9.1.1 or to release 0.9.2.

@gene-eu what do you think?

Enhance objects description in the docs

Precede object's functions descriptions with a simple, close-to-realworld description, like:

Secure Cell.
Secure Cell is symmetric cryptographic container. It is designed to store data in any environment. One key is used to encrypt and decrypt.
Your 99% of the time choice is seal mode, which is most convenient and secure. Context is useful to enhance overall security, you can use row number / record id / user id as context.
Result - a string, a bit longer than original.
You might need token and imprint modes, which are ...

Docs updates

  1. make uninstall

In testing this I noticed that uninstall can fail because of it's dependencies:
uninstall: phpthemis_uninstall rubythemis_uninstall pythonthemis_uninstall

If you have not installed phpthemis then no makefile will have been generated in src/wrappers/themis/php so the attempt to uninstall phpthemis with make distclean fails and causes the whole uninstall process to stop. I don't know if this would also apply similarly for python or ruby.

  1. One possible "Troubleshooting" case is the need to:
    sudo make install
  2. A more esoteric "Troubleshooting" case is OS X 10.11 SIP (aka Rootless). The makefile itself now does all the right things and all you need to do is:
    make phpthemis_install PREFIX=/usr/local

However, the phpize generated ./configure uses ```php-config --extension-dir''' to determine the final destination for phpthemis.so. The default /usr/bin/php-config will return something like /usr/lib/php/extensions/no-debug-non-zts-20121212 ... which is non-writable with SIP.

A solution to this (there may be others) is to:

  1. Create a directory such as /usr/local/lib/php/extensions/sipfix
  2. Copy /usr/bin/php-config to /usr/local/bin/php-config and amend it to reference the new directory
  3. make phpinstall PREFIX=/usr/localwill now install /usr/local/lib/php/extensions/sipfix/phpthemis.so
  4. In php.ini set extension= /usr/local/lib/php/extensions/sipfix/phpthemis.so (i.e. use the full path)

Move Android builds to BoringSSL

AOSP deprecated OpenSSL and recent versions moved to BoringSSL. Probably, we should update Themis for Android to use BoringSSL as well.

PHP Wrapper / Secure Session using wrap/unwrap

Currently the docs advise that in the context of a traditional php backed http request/response, secure session does not make a lot of sense. However it should be possible for people to use the phpthemis in the context of for example a daemonised php/cli.

From my current reading i do not believe that this is the case. My understanding (expressed in plain English) is that:

  1. Both peers will construct and initialise a secure session object each with their own "Id" and private key plus the ability (via a callback) to acquire the public key of a peer from its "Id".
  2. One peer (the client) initiates a session with another (the server) by generating and passing to the server a "connection request" message. The server "unwraps" message and recognises this as part of the session negotiation phase and so simply passes the result of the "unwrap" to the client.
  3. Similarly the client unwraps messages from the server and on recognising that they are part of the negotiation phase, passes the result back to the server until ...
  4. The client sees a message/response from the server that indicates that negotiation is complete. At this point the client will explicitly "wrap" the application level message it want to send and passes it to the server. Similarly the server unwraps and sees the non-negotiation phase message, will perform what ever action the client request is intended to trigger and return a "wrapped" response to the client. Any number of subsequent "application" level client/requests and server/responses may now be performed.

Currently in php_themis.c , while i see object meothod implementations of constructors and the wrap/unwrap functionality, i do not see any means to implement the initiating "connect request".

At the same time in php_themis.h i see defs for traditional non-object functions such as phpthemis_secure_session_generate_connect_request that have no implementation.

As ever this may be a failure of understanding on my part :)

fix the bugs found by cppcheck

This is a complete list of current bugs that you or I can patch. We're providing this as reference. Most, if not all, are in the test suite and third-party tools.

It's also worth noting that we've done extensive studies, and 60% of the time our static analysis tool works all the time. Furthermore, sound and complete static analysis is shown to be undecidable, ergo we're led to a few false positives because we've adopted some unsound techniques in our tool.

  • [jni/external/openssl/crypto/bn/bn_asm.c:160]: (error) Wrong number of parameters for macro 'mul_add'.
  • [./jni/external/openssl/crypto/bn/bn_asm.c:160]: (error) Wrong number of parameters for macro 'mul_add'.
  • [jni/external/openssl/crypto/des/cbc3_enc.c:96]: (error) Uninitialized variable: niv1
  • [jni/external/openssl/crypto/des/cbc3_enc.c:97]: (error) Uninitialized variable: niv2
  • [jni/external/openssl/crypto/des/ofb64ede.c:86]: (error) Uninitialized variable: d
  • [jni/external/openssl/crypto/des/ofb64ede.c:87]: (error) Uninitialized variable: d
  • [jni/external/openssl/crypto/des/ofb64ede.c:103]: (error) Uninitialized variable: d
  • [jni/external/openssl/crypto/des/ofb64enc.c:84]: (error) Uninitialized variable: d
  • [jni/external/openssl/crypto/des/ofb64enc.c:85]: (error) Uninitialized variable: d
  • [jni/external/openssl/crypto/des/ofb64enc.c:96]: (error) Uninitialized variable: d
  • [jni/external/openssl/crypto/des/times/aix.cc] -> [jni/external/openssl/crypto/des/times/aix.cc]: (error) syntax error
  • [jni/external/openssl/crypto/modes/ccm128.c] -> [jni/external/openssl/crypto/modes/ccm128.c]: (error) Invalid value: 1UI64
  • [jni/external/openssl/ssl/s2_clnt.c:432]: (error) syntax error
  • [jni/external/openssl/ssl/s3_clnt.c:2969]: (error) Uninitialized variable: psk
  • [src/soter/openssl/.#soter_hash.c] -> [src/soter/openssl/.#soter_hash.c]: (error) syntax error
  • [src/wrappers/themis/jsthemis/secure_cell_context_imprint.cpp:72]: (error) Mismatching allocation and deallocation: data
  • [src/wrappers/themis/jsthemis/secure_cell_context_imprint.cpp:76]: (error) Mismatching allocation and deallocation: data
  • [src/wrappers/themis/jsthemis/secure_cell_context_imprint.cpp:93]: (error) Mismatching allocation and deallocation: data
  • [src/wrappers/themis/jsthemis/secure_cell_context_imprint.cpp:97]: (error) Mismatching allocation and deallocation: data
  • [src/wrappers/themis/jsthemis/secure_cell_seal.cpp:76]: (error) Mismatching allocation and deallocation: data
  • [src/wrappers/themis/jsthemis/secure_cell_seal.cpp:80]: (error) Mismatching allocation and deallocation: data
  • [src/wrappers/themis/jsthemis/secure_cell_seal.cpp:101]: (error) Mismatching allocation and deallocation: data
  • [src/wrappers/themis/jsthemis/secure_cell_seal.cpp:105]: (error) Mismatching allocation and deallocation: data
  • [src/wrappers/themis/jsthemis/secure_cell_token_protect.cpp:78]: (error) Mismatching allocation and deallocation: data
  • [src/wrappers/themis/jsthemis/secure_cell_token_protect.cpp:84]: (error) Mismatching allocation and deallocation: data
  • [src/wrappers/themis/jsthemis/secure_cell_token_protect.cpp:79]: (error) Mismatching allocation and deallocation: token
  • [src/wrappers/themis/jsthemis/secure_cell_token_protect.cpp:85]: (error) Mismatching allocation and deallocation: token
  • [src/wrappers/themis/jsthemis/secure_cell_token_protect.cpp:110]: (error) Mismatching allocation and deallocation: data
  • [src/wrappers/themis/jsthemis/secure_cell_token_protect.cpp:114]: (error) Mismatching allocation and deallocation: data
  • [src/wrappers/themis/jsthemis/secure_message.cpp:74]: (error) Mismatching allocation and deallocation: encrypted_data
  • [src/wrappers/themis/jsthemis/secure_message.cpp:78]: (error) Mismatching allocation and deallocation: encrypted_data
  • [src/wrappers/themis/jsthemis/secure_message.cpp:93]: (error) Mismatching allocation and deallocation: decrypted_data
  • [src/wrappers/themis/jsthemis/secure_message.cpp:97]: (error) Mismatching allocation and deallocation: decrypted_data
  • [src/wrappers/themis/jsthemis/secure_message.cpp:112]: (error) Mismatching allocation and deallocation: encrypted_data
  • [src/wrappers/themis/jsthemis/secure_message.cpp:116]: (error) Mismatching allocation and deallocation: encrypted_data
  • [src/wrappers/themis/jsthemis/secure_message.cpp:131]: (error) Mismatching allocation and deallocation: decrypted_data
  • [src/wrappers/themis/jsthemis/secure_message.cpp:135]: (error) Mismatching allocation and deallocation: decrypted_data
  • [src/wrappers/themis/jsthemis/secure_session.cpp:96]: (error) Mismatching allocation and deallocation: data
  • [src/wrappers/themis/jsthemis/secure_session.cpp:100]: (error) Mismatching allocation and deallocation: data
  • [src/wrappers/themis/jsthemis/secure_session.cpp:115]: (error) Mismatching allocation and deallocation: data
  • [src/wrappers/themis/jsthemis/secure_session.cpp:119]: (error) Mismatching allocation and deallocation: data
  • [src/wrappers/themis/jsthemis/secure_session.cpp:137]: (error) Mismatching allocation and deallocation: data
  • [src/wrappers/themis/jsthemis/secure_session.cpp:141]: (error) Mismatching allocation and deallocation: data
  • [tests/soter/nist-sts/src/assess.c:299]: (error) Resource leak: fp
  • [tests/soter/nist-sts/src/assess.c:310]: (error) Memory leak: A
  • [tests/soter/nist-sts/src/assess.c:310]: (error) Resource leak: fp
  • [tests/soter/nist-sts/src/assess.c:334]: (error) Memory leak: A
  • [tests/soter/nist-sts/src/assess.c:336]: (error) Resource leak: fp
  • [tests/soter/nist-sts/src/assess.c:186]: (error) Memory leak: fp
  • [tests/soter/nist-sts/src/assess.c:186]: (error) Memory leak: results
  • [tests/soter/nist-sts/src/assess.c:320]: (error) Memory leak: T
  • [tests/soter/nist-sts/src/nonOverlappingTemplateMatchings.c:133]: (error) Memory pointed to by 'sequence' is freed twice.
  • [tests/soter/nist-sts/src/utilities.c:246]: (error) Deallocating a deallocated pointer: fp
  • [tests/themis/themis_seccure_message.c:105]: (error) Memory leak: unwrapped_message
  • [tests/themis/themis_seccure_message.c:53]: (error) Uninitialized variable: res
  • [tests/tools/splint/source/src/cgrammar.c:7609]: (error) Memory allocation size is negative.
  • [tests/tools/splint/source/src/llgrammar.c:4923]: (error) Memory allocation size is negative.
  • [tests/tools/splint/source/src/signature.c:1815]: (error) Memory allocation size is negative.
  • [tests/tools/splint/source/test/abstptr.c:17]: (error) Null pointer dereference: ap
  • [tests/tools/splint/source/test/abstptr.c:18]: (error) Null pointer dereference: ap
  • [tests/tools/splint/source/test/abstptr.c:17]: (error) Null pointer dereference
  • [tests/tools/splint/source/test/abstptr.c:18]: (error) Null pointer dereference
  • [tests/tools/splint/source/test/alias.c:21]: (error) Uninitialized variable: z
  • [tests/tools/splint/source/test/alias2.c:17]: (error) Uninitialized variable: lx
  • [tests/tools/splint/source/test/argorder.c:8]: (error) Expression '"%d %d",z++,z' depends on order of evaluation of side effects
  • [tests/tools/splint/source/test/argorder.c:10]: (error) Expression '(i++,j++),i=3' depends on order of evaluation of side effects
  • [tests/tools/splint/source/test/argorder2.c:19]: (error) Expression 'i++,i' depends on order of evaluation of side effects
  • [tests/tools/splint/source/test/argorder3.c:7]: (error) Expression 'i=i++' depends on order of evaluation of side effects
  • [tests/tools/splint/source/test/argorder3.c:8]: (error) Expression 'a[i]=i++' depends on order of evaluation of side effects
  • [tests/tools/splint/source/test/argorder3.c:9]: (error) Expression 'a[i++]=i' depends on order of evaluation of side effects
  • [tests/tools/splint/source/test/argorder3.c:10]: (error) Expression 'i++*i' depends on order of evaluation of side effects
  • [tests/tools/splint/source/test/argorder3.c:11]: (error) Expression 'i*i++' depends on order of evaluation of side effects
  • [tests/tools/splint/source/test/argorder3.c:12]: (error) Expression '--i*++i' depends on order of evaluation of side effects
  • [tests/tools/splint/source/test/args.c:17]: (error) va_list 'args' was opened but not closed by va_end().
  • [tests/tools/splint/source/test/arraylit.c:13] -> [tests/tools/splint/source/test/arraylit.c:5]: (error) Modifying string literal "unmodifiable .." directly or indirectly is undefined behaviour.
  • [tests/tools/splint/source/test/buffertest1.c:5]: (error) Uninitialized variable: g
  • [tests/tools/splint/source/test/buffertest1.c:8]: (error) Uninitialized variable: g
  • [tests/tools/splint/source/test/buffertest1.c:10]: (error) Uninitialized variable: g
  • [tests/tools/splint/source/test/buffertest1.c:11]: (error) Uninitialized variable: g
  • [tests/tools/splint/source/test/buffertest1.c:12]: (error) Uninitialized variable: g
  • [tests/tools/splint/source/test/buffertest1.c:13]: (error) Uninitialized variable: g
  • [tests/tools/splint/source/test/buffertest1.c:20]: (error) Uninitialized variable: g
  • [tests/tools/splint/source/test/buffertest1.c:21]: (error) Uninitialized variable: g
  • [tests/tools/splint/source/test/chararraylit.c:13] -> [tests/tools/splint/source/test/chararraylit.c:9]: (error) Modifying string literal "abc" directly or indirectly is undefined behaviour.
  • [tests/tools/splint/source/test/constannot.c:20] -> [tests/tools/splint/source/test/constannot.c:6]: (error) Array 'buf[20]' accessed at index 20, which is out of bounds.
  • [tests/tools/splint/source/test/constannot.c:21] -> [tests/tools/splint/source/test/constannot.c:11]: (error) Array 'buf[20]' accessed at index 20, which is out of bounds.
  • [tests/tools/splint/source/test/decl.c:13]: (error) Array 'buf[10]' accessed at index 10, which is out of bounds.
  • [tests/tools/splint/source/test/divzero.c:3]: (error) Division by zero.
  • [tests/tools/splint/source/test/enum.c:15]: (error) Uninitialized variable: a
  • [tests/tools/splint/source/test/fileio/file.c:25]: (error) Uninitialized variable: res
  • [tests/tools/splint/source/test/fileio/filerw.c:8]: (error) Read and write operations without a call to a positioning function (fseek, fsetpos or rewind) or fflush in between result in undefined behaviour.
  • [tests/tools/splint/source/test/fileio/filerw.c:12]: (error) Read and write operations without a call to a positioning function (fseek, fsetpos or rewind) or fflush in between result in undefined behaviour.
  • [tests/tools/splint/source/test/for/for.c:13]: (error) Array 't[11]' accessed at index 11, which is out of bounds.
  • [tests/tools/splint/source/test/funcpointer.c:19]: (error) Address of function parameter 'i' returned.
  • [tests/tools/splint/source/test/iter.h:7]: (error) Invalid number of character '{' when no macros are defined.
  • [tests/tools/splint/source/test/iter2.c:14]: (error) Invalid number of character '{' when no macros are defined.
  • [tests/tools/splint/source/test/libs.c:33]: (error) Read and write operations without a call to a positioning function (fseek, fsetpos or rewind) or fflush in between result in undefined behaviour.
  • [tests/tools/splint/source/test/libs.c:47]: (error) Null pointer dereference
  • [tests/tools/splint/source/test/libs.c:48]: (error) Null pointer dereference
  • [tests/tools/splint/source/test/libs.c:51]: (error) Null pointer dereference
  • [tests/tools/splint/source/test/malloc.c:5]: (error) Array 'ip[22]' accessed at index 88, which is out of bounds.
  • [tests/tools/splint/source/test/malloc.c:15]: (error) Array 'ip[22]' accessed at index 22, which is out of bounds.
  • [tests/tools/splint/source/test/malloc.c:26]: (error) Array 'ip[87]' accessed at index 87, which is out of bounds.
  • [tests/tools/splint/source/test/malloc.c:35]: (error) Array 'ip[43]' accessed at index 86, which is out of bounds.
  • [tests/tools/splint/source/test/malloc.c:3]: (error) The allocated size 89 is not a multiple of the underlying type's size.
  • [tests/tools/splint/source/test/malloc.c:33]: (error) The allocated size 174 is not a multiple of the underlying type's size.
  • [tests/tools/splint/source/test/manual/only.c:13]: (error) Dereferencing 'x' after it is deallocated / released
  • [tests/tools/splint/source/test/manual/only.c:14]: (error) Memory leak: m
  • [tests/tools/splint/source/test/manual/order.c:11]: (error) Expression 'x++*x' depends on order of evaluation of side effects
  • [tests/tools/splint/source/test/manual/order.c:13]: (error) Expression 'y[i]=i++' depends on order of evaluation of side effects
  • [tests/tools/splint/source/test/manual/sample.c:11]: (error) Memory leak: x
  • [tests/tools/splint/source/test/manual/setChar.c:5]: (error) Array 'buf[10]' accessed at index 10, which is out of bounds.
  • [tests/tools/splint/source/test/manual/stack.c:10]: (error) Address of local auto-variable assigned to a function parameter.
  • [tests/tools/splint/source/test/manual/stack.c:12]: (error) Address of an auto-variable returned.
  • [tests/tools/splint/source/test/manual/sumsquares.c:9]: (error) Expression '(i++)*(i++)' depends on order of evaluation of side effects
  • [tests/tools/splint/source/test/merge.c:33]: (error) Dereferencing 'y' after it is deallocated / released
  • [tests/tools/splint/source/test/mergestate/taintednm.c:24]: (error) Pointer to local array variable returned.
  • [tests/tools/splint/source/test/metastate/file2.c:13]: (error) Resource leak: fle1
  • [tests/tools/splint/source/test/metastate/file3.c:13]: (error) Resource leak: fle1
  • [tests/tools/splint/source/test/metastate/file5.c:16]: (error) Returning/dereferencing 'fle' after it is deallocated / released
  • [tests/tools/splint/source/test/metastate/file6.c:20]: (error) Returning/dereferencing 'res' after it is deallocated / released
  • [tests/tools/splint/source/test/metastate/nullbranch.c:32]: (error) Resource leak: f
  • [tests/tools/splint/source/test/moreBufferTests/strncatNotReallyGood.c:4]: (error) Uninitialized variable: buffer
  • [tests/tools/splint/source/test/moreBufferTests2/fixedArrayType.c:9]: (error) Array 'buffer[10]' accessed at index 39, which is out of bounds.
  • [tests/tools/splint/source/test/moreBufferTests2/initBlock.c:8]: (error) Array 'buf[10]' accessed at index 10, which is out of bounds.
  • [tests/tools/splint/source/test/null1.c:19]: (error) Memory leak: y
  • [tests/tools/splint/source/test/null1.c:67]: (error) Memory leak: z3
  • [tests/tools/splint/source/test/nullterminatedtest/buggy_support1.c:47]: (error) Common realloc mistake: 'word' nulled but not freed upon failure
  • [tests/tools/splint/source/test/nullterminatedtest/test1.c:10]: (error) Uninitialized variable: c
  • [tests/tools/splint/source/test/nullterminatedtest/test1.c:11]: (error) Uninitialized variable: c
  • [tests/tools/splint/source/test/nullterminatedtest/test1.c:13]: (error) Uninitialized variable: d
  • [tests/tools/splint/source/test/nullterminatedtest/test3.c:14]: (error) Uninitialized variable: y
  • [tests/tools/splint/source/test/nullterminatedtest/test3.c:16]: (error) Uninitialized variable: y
  • [tests/tools/splint/source/test/nullterminatedtest/test3.c:19]: (error) Uninitialized variable: y
  • [tests/tools/splint/source/test/nullterminatedtest/test3.c:14]: (error) Uninitialized variable: x
  • [tests/tools/splint/source/test/nullterminatedtest/test3.c:34]: (error) Uninitialized variable: d
  • [tests/tools/splint/source/test/outparam.c:48]: (error) Memory leak: t4
  • [tests/tools/splint/source/test/outparam.c:8]: (error) Uninitialized variable: u1
  • [tests/tools/splint/source/test/outparam.c:9]: (error) Uninitialized variable: u1
  • [tests/tools/splint/source/test/outparam.c:37]: (error) Uninitialized variable: b
  • [tests/tools/splint/source/test/outparam.c:48]: (error) Uninitialized variable: b
  • [tests/tools/splint/source/test/outparam.c:37]: (error) Uninitialized variable: c
  • [tests/tools/splint/source/test/outparam.c:39]: (error) Uninitialized variable: c
  • [tests/tools/splint/source/test/outparam.c:40]: (error) Uninitialized variable: c
  • [tests/tools/splint/source/test/outparam.c:39]: (error) Uninitialized variable: d
  • [tests/tools/splint/source/test/outparam.c:40]: (error) Uninitialized variable: d
  • [tests/tools/splint/source/test/outparam.c:41]: (error) Uninitialized variable: t
  • [tests/tools/splint/source/test/outparam.c:42]: (error) Uninitialized variable: t2
  • [tests/tools/splint/source/test/outparam.c:42]: (error) Uninitialized struct member: t2.a
  • [tests/tools/splint/source/test/outparam.c:44]: (error) Uninitialized variable: t3
  • [tests/tools/splint/source/test/sharing1.c:59]: (error) Memory leak: y2
  • [tests/tools/splint/source/test/sharing1.c:59]: (error) Memory leak: y3
  • [tests/tools/splint/source/test/sharing5.c:32]: (error) Memory leak: localp
  • [tests/tools/splint/source/test/shifts.c:17]: (error) Shifting by a negative value is undefined behaviour
  • [tests/tools/splint/source/test/simplebufferConstraintTests/sizeof.c:17]: (error) Array 'x[3]' accessed at index 3, which is out of bounds.
  • [tests/tools/splint/source/test/simplebufferConstraintTests/test3.c:9]: (error) Array 'g[100]' accessed at index 101, which is out of bounds.
  • [tests/tools/splint/source/test/simplebufferConstraintTests/test3.c:10]: (error) Array 'g[100]' accessed at index 100, which is out of bounds.
  • [tests/tools/splint/source/test/sizeof.c:6]: (error) Array 'x[3]' accessed at index 3, which is out of bounds.
  • [tests/tools/splint/source/test/sizeoftest/sizeof.c:6]: (error) Array 'x[3]' accessed at index 3, which is out of bounds.
  • [tests/tools/splint/source/test/special.c:31]: (error) printf format string requires 3 parameters but only 2 are given.
  • [tests/tools/splint/source/test/special.c:17]: (error) Uninitialized variable: c
  • [tests/tools/splint/source/test/special.c:29]: (error) Uninitialized variable: c
  • [tests/tools/splint/source/test/special.c:30]: (error) Uninitialized variable: c
  • [tests/tools/splint/source/test/special.c:31]: (error) Uninitialized variable: c
  • [tests/tools/splint/source/test/special.c:27]: (error) Uninitialized variable: s
  • [tests/tools/splint/source/test/stack.c:9]: (error) Address of local auto-variable assigned to a function parameter.
  • [tests/tools/splint/source/test/stack.c:20]: (error) Address of an auto-variable returned.
  • [tests/tools/splint/source/test/stack.c:31]: (error) Pointer to local array variable returned.
  • [tests/tools/splint/source/test/stack.c:35]: (error) Pointer to local array variable returned.
  • [tests/tools/splint/source/test/strings.c:12] -> [tests/tools/splint/source/test/strings.c:24]: (error) Modifying string literal "hullo" directly or indirectly is undefined behaviour.
  • [tests/tools/splint/source/test/t1.c:5]: (error) Memory leak: z
  • [tests/tools/splint/source/test/tainted/tainted.c:19]: (error) Memory leak: t
  • [tests/tools/splint/source/test/tainted/taintedimplicit.c:12]: (error) Allocation with taintme, system doesn't release it.
  • [tests/tools/splint/source/test/tainted/taintedimplicit.c:17]: (error) Allocation with taintme, system doesn't release it.
  • [tests/tools/splint/source/test/tainted/taintedmerge.c:16]: (error) Pointer to local array variable returned.
  • [tests/tools/splint/source/test/tainted/test.c:8]: (error) Memory leak: t
  • [tests/tools/splint/source/test/test.c:3]: (error) Uninitialized variable: ip
  • [tests/tools/splint/source/test/tests2.2/arbints.c:22]: (error) Uninitialized variable: l
  • [tests/tools/splint/source/test/tests2.2a/toralf.c:15]: (error) Uninitialized variable: i1
  • [tests/tools/splint/source/test/tests2.2a/toralf.c:15]: (error) Uninitialized variable: f
  • [tests/tools/splint/source/test/tests2.4/array.c:17]: (error) Memory leak: p
  • [tests/tools/splint/source/test/tests2.4/ulrich.c:16]: (error) Memory leak: newblock
  • [tests/tools/splint/source/test/tests2.5/boolbad.c:12]: (error) Uninitialized variable: foo
  • [tests/tools/splint/source/test/tests2.5/impabsmodule.c:10]: (error) Uninitialized variable: var
  • [tests/tools/splint/source/test/tests2.5/impabsmodule.c:10]: (error) Uninitialized variable: var2
  • [tests/tools/splint/source/test/ud.c:10]: (error) Uninitialized variable: z
  • [tests/tools/splint/source/test/ud.c:50]: (error) Uninitialized variable: z5
  • [tests/tools/splint/source/test/ud.c:39]: (error) Uninitialized variable: j
  • [tests/tools/splint/source/test/ud.c:40]: (error) Uninitialized variable: j
  • [tests/tools/splint/source/test/ud.c:49]: (error) Uninitialized variable: i
  • [tests/tools/splint/source/test/ullint.c:30]: (error) Array '_src[6]' accessed at index 7, which is out of bounds.

Found by https://github.com/bryongloden/cppcheck

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.