Giter Club home page Giter Club logo

kedr's People

Contributors

euspectre avatar khoroshilov avatar tsyvarev avatar

Watchers

 avatar

kedr's Issues

Add support for suppressions in LeakCheck

There are situations where LeakCheck may output many false positives (see 
http://code.google.com/p/kedr/wiki/Known_Issues) which are currently too 
difficult to avoid.

Perhaps the means to suppress some kinds of errors could be useful here. The 
idea is similar to what Valgrind already uses, esp. for glibc, GTK+ and so on: 
http://valgrind.org/docs/manual/manual-core.html#manual-core.suppress

I guess, we don't need exactly those complex Valdrind-style suppressions, 
something that would allow identify the events to be supressed by their type 
and call stack would probably do.

Something like this:

ALLOC
  func1
  *
  func2
  func3

That would mean, "suppress reporting of memory leaks with the call stack that 
contains the following sequence of items: func1 called from somewhere (*), 
called from func2, which was in turn called from func3".

The call stack does not have to be fully defined, it a part of it matches, that 
would do.

Another example:

FREE
  func_bar

That would mean, "suppress reporting of unallocated frees if such events 
happened in func_bar(), including the functions called from it, etc."

The suppression information could be passed to to LeakCheck via debugfs, for 
example.

Original issue reported on code.google.com by [email protected] on 12 Apr 2013 at 7:37

make fails in kennel 3.11.0-19-generic

What steps will reproduce the problem?
1. Download latest kedr-0.4.2 and untar it
2. Create a new folder, kedr-build and cd kedr-build
3. cmake ../kedr-0.4.2 and build succeed
4. make 
5. Throw error message in in above make step


What is the expected output? What do you see instead?

Expected: Make should pass
Actual: 

In function ‘functions_map_add’:
/home/soibam/kedr_build/core/kedr_base.c:849:63: error: macro 
"hlist_for_each_entry" passed 4 arguments, but takes just 3
  hlist_for_each_entry(map_elem, node_tmp, &map->heads[i], list)
                                                               ^
/home/soibam/kedr_build/core/kedr_base.c:849:2: error: 
‘hlist_for_each_entry’ undeclared (first use in this function)
  hlist_for_each_entry(map_elem, node_tmp, &map->heads[i], list)
  ^
/home/soibam/kedr_build/core/kedr_base.c:849:2: note: each undeclared 
identifier is reported only once for each function it appears in
/home/soibam/kedr_build/core/kedr_base.c:850:2: error: expected ‘;’ before 
‘{’ token
  {
  ^
/home/soibam/kedr_build/core/kedr_base.c:844:21: warning: unused variable 
‘node_tmp’ [-Wunused-variable]
  struct hlist_node* node_tmp;
                     ^
/home/soibam/kedr_build/core/kedr_base.c: In function 
‘functions_map_remove’:
/home/soibam/kedr_build/core/kedr_base.c:876:63: error: macro 
"hlist_for_each_entry" passed 4 arguments, but takes just 3
  hlist_for_each_entry(map_elem, node_tmp, &map->heads[i], list)
                                                               ^
/home/soibam/kedr_build/core/kedr_base.c:876:2: error: 
‘hlist_for_each_entry’ undeclared (first use in this function)
  hlist_for_each_entry(map_elem, node_tmp, &map->heads[i], list)
  ^
/home/soibam/kedr_build/core/kedr_base.c:877:2: error: expected ‘;’ before 
‘{’ token
  {
  ^
/home/soibam/kedr_build/core/kedr_base.c:872:29: warning: unused variable 
‘map_elem’ [-Wunused-variable]
  struct functions_map_elem* map_elem;
                             ^
/home/soibam/kedr_build/core/kedr_base.c:871:21: warning: unused variable 
‘node_tmp’ [-Wunused-variable]
  struct hlist_node* node_tmp;
                     ^
/home/soibam/kedr_build/core/kedr_base.c: In function 
‘function_counters_table_get’:
/home/soibam/kedr_build/core/kedr_base.c:996:61: error: macro 
"hlist_for_each_entry" passed 4 arguments, but takes just 3
  hlist_for_each_entry(elem, node_tmp, &table->heads[i], list)
                                                             ^
/home/soibam/kedr_build/core/kedr_base.c:996:2: error: 
‘hlist_for_each_entry’ undeclared (first use in this function)
  hlist_for_each_entry(elem, node_tmp, &table->heads[i], list)
  ^
/home/soibam/kedr_build/core/kedr_base.c:997:2: error: expected ‘;’ before 
‘{’ token
  {
  ^
/home/soibam/kedr_build/core/kedr_base.c:991:21: warning: unused variable 
‘node_tmp’ [-Wunused-variable]
  struct hlist_node* node_tmp;



What version of the product are you using? On what operating system?

Product: kedr-0.4.1

OS : Ubuntu 13.04 with kernel version 3.11.0-19-generic


Please provide any additional information below.


Original issue reported on code.google.com by [email protected] on 11 Apr 2014 at 8:37

(Fixed in Hg) Intercept the implementation of kfree_rcu

LeakCheck should handle kfree_rcu() (appeared in version 3.0 of the kernel). 
For the present, it does not and therefore gives false positives.

N.B. kfree_rcu() is actually a macro, so we need to track whatever it unwraps 
to at the binary level.

Reported-by: Brice Goglin

Original issue reported on code.google.com by [email protected] on 15 Dec 2011 at 3:15

Leak check: "flush" leak statistics at any time (patch included)

Hello!

I think it would be nice to have an option to flush
statistics at any time.

There are at least two reasons:
 - Certain drivers cannot be unloaded without breaking something. There may be a way to do that, though, but it's certainly tricky, if any. Who would want to unload a video card driver during normal usage, anyway?
 - Sometimes it's useful to isolate leaks that occur during certain time span. 

The patch is pretty hackish, and, I guess, it does require additional work. But 
it works, and, if I understand the code correctly, shouldn't cause any leaks or 
crashes.

Original issue reported on code.google.com by [email protected] on 8 Apr 2013 at 6:24

Attachments:

allocations via kzalloc_node() are not properly tracked

I don't have a more recent system handy to test, but on my CentOS 6.3 
2.6.32-358.23.2.el6.x86_64 system I observed the following behaviour with the 
leak checker:

'Unallocated frees' were reported on memory allocated by kzalloc_node() which 
had matching calls to kfree().  Likewise the 'Allocations' were reported as 
being much lower.  Changing all allocations to kzalloc() instead resolved all 
counts.

-Brett Ciphery

Original issue reported on code.google.com by [email protected] on 12 Aug 2014 at 1:44

Fails to compile with linux 3.9

What steps will reproduce the problem?
1. mkdir build
2. cd build
3. cmake ..
4. make

What version of the product are you using? On what operating system?
Archlinux testing/linux

Please provide any additional information below.

Scanning dependencies of target kedr
[  2%] Generating arch/x86/lib/inat-tables.h
[  2%] Generating kedr_module.c
[  2%] Generating kedr_base.c
[  2%] Generating kedr_instrumentor.c
[  4%] Generating kedr_functions_support.c
[  4%] Generating kedr_target_detector.c
[  4%] Generating arch/x86/lib/inat.c
[  4%] Generating arch/x86/lib/insn.c
[  7%] Generating kedr.ko, Module.symvers
/tmp/kedr-0.4.1/build/core/kedr_base.c: In function ‘functions_map_add’:
/tmp/kedr-0.4.1/build/core/kedr_base.c:849:63: error: macro 
"hlist_for_each_entry" passed 4 arguments, but takes just 3
  hlist_for_each_entry(map_elem, node_tmp, &map->heads[i], list)
                                                               ^
/tmp/kedr-0.4.1/build/core/kedr_base.c:849:2: error: ‘hlist_for_each_entry’ 
undeclared (first use in this function)
  hlist_for_each_entry(map_elem, node_tmp, &map->heads[i], list)
  ^
/tmp/kedr-0.4.1/build/core/kedr_base.c:849:2: note: each undeclared identifier 
is reported only once for each function it appears in
/tmp/kedr-0.4.1/build/core/kedr_base.c:850:2: error: expected ‘;’ before 
‘{’ token
  {
  ^
/tmp/kedr-0.4.1/build/core/kedr_base.c:844:21: warning: unused variable 
‘node_tmp’ [-Wunused-variable]
  struct hlist_node* node_tmp;
                     ^
/tmp/kedr-0.4.1/build/core/kedr_base.c: In function ‘functions_map_remove’:
/tmp/kedr-0.4.1/build/core/kedr_base.c:876:63: error: macro 
"hlist_for_each_entry" passed 4 arguments, but takes just 3
  hlist_for_each_entry(map_elem, node_tmp, &map->heads[i], list)
                                                               ^
/tmp/kedr-0.4.1/build/core/kedr_base.c:876:2: error: ‘hlist_for_each_entry’ 
undeclared (first use in this function)
  hlist_for_each_entry(map_elem, node_tmp, &map->heads[i], list)
  ^
/tmp/kedr-0.4.1/build/core/kedr_base.c:877:2: error: expected ‘;’ before 
‘{’ token
  {
  ^
/tmp/kedr-0.4.1/build/core/kedr_base.c:872:29: warning: unused variable 
‘map_elem’ [-Wunused-variable]
  struct functions_map_elem* map_elem;
                             ^
/tmp/kedr-0.4.1/build/core/kedr_base.c:871:21: warning: unused variable 
‘node_tmp’ [-Wunused-variable]
  struct hlist_node* node_tmp;
                     ^
/tmp/kedr-0.4.1/build/core/kedr_base.c: In function 
‘function_counters_table_get’:
/tmp/kedr-0.4.1/build/core/kedr_base.c:996:61: error: macro 
"hlist_for_each_entry" passed 4 arguments, but takes just 3
  hlist_for_each_entry(elem, node_tmp, &table->heads[i], list)
                                                             ^
/tmp/kedr-0.4.1/build/core/kedr_base.c:996:2: error: ‘hlist_for_each_entry’ 
undeclared (first use in this function)
  hlist_for_each_entry(elem, node_tmp, &table->heads[i], list)
  ^
/tmp/kedr-0.4.1/build/core/kedr_base.c:997:2: error: expected ‘;’ before 
‘{’ token
  {
  ^
/tmp/kedr-0.4.1/build/core/kedr_base.c:991:21: warning: unused variable 
‘node_tmp’ [-Wunused-variable]
  struct hlist_node* node_tmp;
                     ^
make[4]: *** [/tmp/kedr-0.4.1/build/core/kedr_base.o] Error 1
make[3]: *** [_module_/tmp/kedr-0.4.1/build/core] Error 2
make[2]: *** [core/kedr.ko] Error 2
make[1]: *** [core/CMakeFiles/kedr.dir/all] Error 2
make: *** [all] Error 2

Original issue reported on code.google.com by [email protected] on 7 May 2013 at 12:09

(Fixed in KEDR 0.4) Intercept calls to kasprintf and kvasprintf

kasprintf() and kvasprintf() declared in <linux/kernel.h> and defined in 
lib/kasprintf.c allocate memory with kmalloc(). These functions are exported 
and are used by a couple of kernel modules.

It should be useful to intercept the calls to these functions, at least in 
LeakCheck.

Original issue reported on code.google.com by [email protected] on 24 Oct 2011 at 10:09

One KEDR installation for many kernels

Currently, the only way to work with several kernels on one machine is to have 
different KEDR installations, one per kernel.
If other application(e.g, testsuite) requires KEDR installed, this application 
should share same politics: one application's installation per kernel. This is 
needed even if application itself doesn't have kernel-space part.
Having several installations of one application for same purpose is very 
inconvenient.

Support for dkms functionality or similar from KEDR would be very useful.

Original issue reported on code.google.com by [email protected] on 21 Jan 2014 at 6:07

Analyze multiple modules at a time

KEDR's inability to analyze several modules at once is a known problem.

There should be an open issue about it :)

Just an example where it's important: consider DRM-based GPU driver. When it's 
loaded, a whole bunch of other modules is also loaded.

i915, cfbfillrect, cfbimgbit, i2c_algo_bit, cfbcopyarea, drm_kms_helper, drm, 
intel_agp, intel_gtt, agpgart

Original issue reported on code.google.com by [email protected] on 19 May 2013 at 11:42

(Fixed in Hg) Kedr fails to build on kernel 3.4.0-rc2

When buildin Kedr from repository on kernel 3.4.0-rc2, compilation fails with:

/home/winnukem/kedr/build/core/arch/x86/lib/inat.c:32:13: error: conflicting 
types for ‘inat_get_escape_attribute’
/usr/src/packages/BUILD/kernel-3.4.0_rc2_gcov/arch/x86/include/asm/inat.h:101:20
: note: previous declaration of ‘inat_get_escape_attribute’ was here
/home/winnukem/kedr/build/core/arch/x86/lib/inat.c:55:13: error: conflicting 
types for ‘inat_get_group_attribute’
/usr/src/packages/BUILD/kernel-3.4.0_rc2_gcov/arch/x86/include/asm/inat.h:104:20
: note: previous declaration of ‘inat_get_group_attribute’ was here
make[4]: *** [/home/winnukem/kedr/build/core/arch/x86/lib/inat.o] Error 1
make[3]: *** [_module_/home/winnukem/kedr/build/core] Error 2
make[2]: *** [core/kedr.ko] Error 2
make[1]: *** [core/CMakeFiles/kedr.dir/all] Error 2
make: *** [all] Error 2

After changing the inat_get_escape_attribute and inat_get_group_attribute 
declarations to

insn_attr_t inat_get_escape_attribute(insn_byte_t opcode, int last_pfx, 
insn_attr_t esc_attr)
insn_attr_t inat_get_group_attribute(insn_byte_t modrm, int last_pfx, 
insn_attr_t grp_attr),

compilation still fails with

/home/winnukem/kedr/build/core/arch/x86/lib/insn.c: In function 
‘insn_get_opcode’:
/home/winnukem/kedr/build/core/arch/x86/lib/insn.c:204:3: error: implicit 
declaration of function ‘insn_last_prefix’ 
[-Werror=implicit-function-declaration]
cc1: some warnings being treated as errors
make[4]: *** [/home/winnukem/kedr/build/core/arch/x86/lib/insn.o] Error 1
make[3]: *** [_module_/home/winnukem/kedr/build/core] Error 2
make[2]: *** [core/kedr.ko] Error 2
make[1]: *** [core/CMakeFiles/kedr.dir/all] Error 2
make: *** [all] Error 2

After changing insn_get_opcode calls to insn_get_opcode_id, compilation fails 
like in http://code.google.com/p/kedr/issues/detail?id=5

Original issue reported on code.google.com by [email protected] on 16 Apr 2012 at 11:54

(Fixed in KEDR 0.4) KEDR fails to build for kernel 3.3.0

When building KEDR 0.3 on the Linux kernel 3.3.0, compilation fails with the 
following error:

------------------
[ 63%] Generating kedr_cm_schedule.ko, Module.symvers
Generating kedr_cm_vmm.ko, Module.symvers
Generating kedr_cm_cmm.ko, Module.symvers
[ 63%] Generating kedr_leak_check.ko, Module.symvers
/opt/kedr/payloads_callm/waitqueue/functions_support.c: In function 
'kedr_intermediate_func___init_waitqueue_head':
/opt/kedr/payloads_callm/waitqueue/functions_support.c:96: warning: passing 
argument 2 of '__init_waitqueue_head' from incompatible pointer type
include/linux/wait.h:80: note: expected 'const char *' but argument is of type 
'struct lock_class_key *'
/opt/kedr/payloads_callm/waitqueue/functions_support.c:96: error: too few 
arguments to function '__init_waitqueue_head'
make[4]: *** [/opt/kedr/payloads_callm/waitqueue/functions_support.o] Error 1
make[3]: *** [_module_/opt/kedr/payloads_callm/waitqueue] Error 2
make[2]: *** [payloads_callm/waitqueue/kedr_cm_waitqueue.ko] Error 2
make[1]: *** [payloads_callm/waitqueue/CMakeFiles/kedr_cm_waitqueue.dir/all] 
Error 2
make[1]: *** Waiting for unfinished jobs....
------------------

It seems that the signature of __init_waitqueue_head changed in the kernel 
3.3.0:

void __init_waitqueue_head(wait_queue_head_t *q, const char *name, struct 
lock_class_key *key)

In the kernel 3.2.x and earlier, it has no 'name' argument:
void __init_waitqueue_head(wait_queue_head_t *q, struct lock_class_key *key)

The problem seems to affect call tracing facilities only. If they are not used, 
one can disable them when configuring KEDR, as a temporary workaround:

cmake -DKEDR_STANDARD_CALLM_PAYLOADS=off \
    <other_options_if_needed> <path_to_kedr_source_tree>

Original issue reported on code.google.com by [email protected] on 20 Mar 2012 at 6:59

Use .owner field for module, which own functions registered by structure

Kernel's structures file_system_type and file_operations use 'struct module 
*owner' field for module, which owns functions set as callback in these 
structures.
KEDR structures 'kedr_payload' and 'kedr_functions_support' use 'mod' field for 
the same purpose.

I suggest to rename 'mod' to 'owner' in KEDR structures, as it reflects field 
purpose clearly and follows kernel conventions.

This renaming would require corresponded changes in KEDR-dependent projects, 
but it shouldn't be a big problem.

Original issue reported on code.google.com by [email protected] on 22 Jan 2015 at 1:33

KEDR 0.4.1 could not be built in Kernel 3.11.10 x86_64 (Fedora 20)

What steps will reproduce the problem?
1. "make" failed in Kernel 3.11.10 x86_64

What is the expected output? What do you see instead?

./kedr_build/fault_indicators/kmalloc/indicator.c:78:2: error: implicit 
declaration of function /random32'

What version of the product are you using? On what operating system?
KEDR 0.4.1
Kernel 3.11.10 x86_64 (Fedora 20)

Please provide any additional information below.


Original issue reported on code.google.com by [email protected] on 13 Mar 2015 at 8:31

Documentation should introduce "KEDR Fault Simulation" when describe fault simulation facility

KEDR itself is only a platform for building instruments for analyze kernel 
modules.

Several instruments are already created and included into distributed package - 
KEDR Leak Check, KEDR Fault Simulation and KEDR Call Monitoring.

But documentation refers only to "facilities" provided by the KEDR when refers 
to fault simulation or call monitoring.
Because of this, users sometimes (incorrectly) say, that "KEDR platform allows 
fault simulation and allows to setup scenarios for it.".

It would be better to explicitly distinguish KEDR (as platform) and instruments 
built on it in the documentation.

Current documentation already uses term "LeakCheck" when refers to detecting 
memory leaks functionality of KEDR. Description of other functionalities may be 
given in similar way.

Original issue reported on code.google.com by [email protected] on 1 Nov 2012 at 8:56

Test leak_check.kfree_rcu.01 freeze system

System becomes completely unresponsible few moments after the test  
leak_check.kfree_rcu.01 begins.

Reproduced on OpenSUSE 13.1, Linux kernel 3.11.25 and 3.18.1(vanilla).
On previous distro-specific kernel (3.11.7 or near) the test has passed 
successfully. Same for many others distro/kernel pairs.

Playing with tests/leak_check/kfree_rcu_module/test_module.c shows that 
problems remains when code for 'foo' allocation/deallocation is removed, but 
disappears when code for 'bar' is removed instead.
Without Leak Check given module is loaded/unloaded without errors.

Original issue reported on code.google.com by [email protected] on 19 Jan 2015 at 8:54

detecting sk_buff leaks

Hello,

I'd like KEDR to track sk_buff alloc/free. I wrote some basic code to track 
__alloc_skb, skb_clone and kfree_skb. It's not perfect because it only tracks 
struct sk_buff allocation/free, not the data buffer it points to, but that 
doesn't matter for me here.

Now here's my problem:

The sk_buff is allocated by me on the send side and given to the network. It's 
basically free'd by the network driver after send (outside of the module I am 
debugging). On the receive side, the incoming sk_buff is allocated by the 
driver before giving it to me, and I take care of freeing it.

I worked around the send side problem by declaring that dev_queue_xmit() takes 
care of freeing my sk_buff. The freeing doesn't occur in dev_queue_xmit() for 
real, but that's where my module last sees its outgoing sk_buff, so that's fine.

On the receive side, it's harder. If the Linux receive model was my module 
calling a core/driver function to get the next incoming sk_buff, I would just 
tell KEDR that this function allocates the sk_buff. But the Linux model is the 
opposite: the core/driver calls a callback in my module with the incoming skb 
as a parameter.

So I basically need a way to tell KEDR "the skb passed to my module here has 
been allocated earlier, now please track it". How can I do that?

Brice Goglin

PS: Yeah, I'll share my code if you're interested

Original issue reported on code.google.com by [email protected] on 22 Feb 2012 at 2:53

(Fixed in KEDR 0.4) KEDR should detect loading of module with '-' in its name

Inside Linux kernel all '-' characters in module name are internally replaced 
with '_'.
KEDR should take this into account when detect target module loading.

E.g., when running with

# kedr start ideapad-laptop

KEDR should detect loading of module ideapad-laptop.

Now it detects loading of this module only if running with

# kedr start ideapad_laptop

So KEDR user should be aware of special processing of '-' character in module 
name. That is inconvenient.


Original issue reported on code.google.com by [email protected] on 2 Dec 2011 at 7:10

Instrumentation facilities do not work for kernel 3.16-rc2: RO/NX issue

Instrumentation facilities do not work for kernel 3.16-rc2 because the code of 
a kernel module now becomes read-only earlier (if 
CONFIG_DEBUG_SET_MODULE_RONX=y).

That is, earlier than the notifier is called and the instrumentation starts.

Here is the commit: 
https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=49822
23e51e8ea9d09bb33c8323b5ec1877b2b51

We need to either do the instrumentation earlier (see how Ftrace got around 
this) or remove RO before and restore it after instrumentation if needed.

Original issue reported on code.google.com by [email protected] on 25 Jun 2014 at 9:39

Add processing of put_page()

put_page() is sometimes used to deallocate memmory pages that were allocated 
with alloc_page() or the like. 

Among other things, page_cache_release(), which is often used by filesystem 
modules, expands to put_page() too.

It may make sense to investigate the typical usage scenarios of put_page() in 
the kernel, intercept the calls to this function and process it as a 
deallocation routine in LeakCheck.

Original issue reported on code.google.com by [email protected] on 25 Feb 2013 at 2:12

Templates for Fault Simulation payloads should support conditional simulation points

There are functions in the kernel, which may not fail in some conditions.
Examples:
- mempool_alloc never fails if called in process context,
- bio_add_page always succeed, if single page is added to the empty bio.

Some drivers use such functions in fail-never scenarios, and intentionally do 
not check errors. Fault simulation should not break such modules.

It seems, that allowing to specify raw code for replacement function would be 
good way for support fault simulation payloads with conditional points.
This also helps in case when 'normal' function flaw may not be expressed in 
original function call(e.g., when reading function's arguments modify them).

Original issue reported on code.google.com by [email protected] on 22 Jan 2015 at 2:00

  • Blocking: #10

Some functions to simulate

We have found out several kernel functions that are used (at least) in JFS and 
simulating faults in these functions could make KEDR Fault Simulation better.

Here is the (still growing) list of such functions:

kmem_cache_create
kthread_create_on_node
mempool_create
mempool_alloc (Maybe no one expects this function to fail, but still...)
__dquot_alloc_space
filemap_write_and_wait_range
read_cache_page
write_one_page
submit_bio (A really dangerous function. Brings to crash at least in JFS)
d_alloc_root (This function is removed in Linux v3.4 and is replaced by 
d_make_root)

Original issue reported on code.google.com by vmartirosyan on 9 Apr 2013 at 6:51

  • Blocked on: #22

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.